ruby-on-rails - electronico - correo de confirmacion ejemplo
¿Desea confirmar, cómo reenviar un correo electrónico de confirmación al hacer clic? (9)
Aquí está mi solución que abrirá el formulario de dispositivo donde el usuario puede ingresar la dirección de correo electrónico y solicitar un nuevo correo electrónico con el token de confirmación. Se preserva toda la lógica del dispositivo con respecto a la verificación del correo electrónico:
app / controllers / confirmations_controller.rb
class ConfirmationsController < Devise::ConfirmationsController
# GET /resource/confirmation/new
def new
self.resource = resource_class.new
end
end
config / route.rb
devise_for :users, controllers: { confirmations: "confirmations" }
app / views / devise / confirmations / new.html.erb
<h2>Resend confirmation instructions</h2>
<%= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>
<div><%= f.submit "Resend confirmation instructions" %></div>
<% end %>
<%= render "devise/shared/links" %>
Estoy usando un dispositivo confirmable. Quiero darle al usuario un enlace para hacer clic y reenviar el correo electrónico de confirmación. El problema es que cuando el usuario hace clic en el enlace, no va al controlador de dispositivos. ¿Hay algo que me falta en el archivo route.rb? He aquí mi arreglo:
rutas.rb
devise_for :users, :controllers => { :registrations => "registrations", :sessions => "sessions", :omniauth_callbacks => "authentications" }
usuario.rb
devise :omniauthable, :database_authenticatable, :registerable, :confirmable, :recoverable, :rememberable, :trackable, :validatable
La vista:
<a href="/users/confirmation/new" data-remote="true" data-method="post">Resend confirmation</a>
Gracias
Aquí está mi solución. Espero que no falte algo en mi cambio en resource_params. Nota: no ajaxified
controlador de confirmación
class ConfirmationsController < Devise::ConfirmationsController
# POST /resource/confirmation
def create
# self.resource = resource_class.send_confirmation_instructions(resource_params)
self.resource = resource_class.send_confirmation_instructions({email: current_user.email})
if successfully_sent?(resource)
respond_with({}, :location => after_resending_confirmation_instructions_path_for(resource_name))
else
respond_with(resource)
end
end
protected
# The path used after resending confirmation instructions.
def after_resending_confirmation_instructions_path_for(resource_name)
root_path
end
end
rutas
devise_for :users, controllers: { confirmations: "confirmations" }
ver
<%= link_to "resend confirmation", user_confirmation_path, data: { method: :post } %>
Bastante viejo post. Sin embargo, en lugar de enviar las instrucciones directamente, es posible que desee apuntar al usuario al flujo de trabajo de Devise:
= link_to ''Resend confirmation'', new_user_confirmation_path
Eso llevará al usuario a la vista de Devise que solicita el correo electrónico para enviar las instrucciones de confirmación.
Espero que ayude a cualquiera, de todos modos. :)
Como puede ver en https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L2 , el método HTTP para la confirmación # nuevo es GET, no POST. Intente eliminar ''data-method = "post"'' y vea si funciona.
Es posible que desee programar esto para que se ejecute todas las noches para que no tenga que verlo.
Aquí hay un artículo sobre cómo hacerlo.
http://www.cheynewallace.com/resend-devise-confirmation-emails-for-incomplete
Estoy compartiendo mi solución, ya que es un poco diferente, pero en mi opinión está más cerca del flujo normal de usuarios (redirigir a la página de agradecimientos donde tiene un botón para reenviar sin escribir de nuevo el correo electrónico), y no tendrá que anular El controlador de confirmaciones.
Después de registrarse, el usuario es redirigido a una página de ''Gracias''. En registrations_controller:
def after_inactive_sign_up_path_for(resource)
session[:user_id] = resource.id
redirect_to thanks_url
end
en el controlador de usuarios, solo usa las instrucciones .send_confirmation_instructions en user
def thanks
@user = User.find_by(id: session[:user_id])
end
def resend_confirmation
user = User.find_by(id: params[:user_id])
user.send_confirmation_instructions
end
rutas:
get ''/thanks'', to: ''users#thanks''
post ''/resend_confirmation'', to: ''users#resend_confirmation'', as: ''resend_confirmation''
Finalmente, en la vista de ''gracias'':
<%= button_to "Resend confirmation", resend_confirmation_path(:user_id => @user.id) %>
Esto podría limpiarse un poco, estoy seguro, ya que lo acabo de escribir y todavía soy nuevo en Rails, pero estaba buscando este tipo de soluciones en Stack y no pude encontrarlo, así que pensé en compartirlas. eso.
Para reenviar el correo electrónico de confirmación, desea que el método de publicación solo incluya ''usuarios / confirmación'', no ''nuevo'' al final.
Aquí hay un formulario que solicita el correo electrónico del usuario y envía la solicitud de reenvío de confirmación a Devise de la siguiente manera:
form_for(resource, url: user_confirmation_path) do |f|
.form-inputs
= f.input :email
.form-actions
= f.button :submit, "Resend"
para enviar instrucciones de confirmación al usuario, encuentre al usuario y luego simplemente user.send_confirmation_instructions
namespace :user do
task :resend_confirmation => :environment do
users = User.where(''confirmation_token IS NOT NULL'')
users.each do |user|
user.send_confirmation_instructions
end
end
end
resource_params
es un método definido en el controlador de dispositivo que obtiene los recursos de controlador específicos del dispositivo (Usuario), por ejemplo. definición en DeviseController
def resource_params
params.fetch(resource_name, {})
end
así que para pasar el correo electrónico como parámetro, debe incluirlo en un hash de usuario, así que en la vista en lugar de
link_to(''resend'', user_confirmation_path(email: "[email protected]"), :method => :post)
inserta el email en un hash
link_to(''resend'', user_confirmation_path(user: {:email => "[email protected]"}), :method => :post)
De esta manera, el dispositivo recogerá el parámetro de correo electrónico.