para electronico ejemplo correo confirmar confirmacion como cambiar actualizar ruby-on-rails ruby-on-rails-3 devise

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. :)




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.