J'utilise un appareil confirmable. Je veux donner à l'utilisateur un lien pour cliquer et renvoyer l'e-mail de confirmation. Le problème est que lorsque l'utilisateur clique sur le lien, il ne va pas au contrôleur de périphérique. Y a-t-il quelque chose qui me manque dans le fichier routes.rb? Voici ma configuration:
routes.rb
devise_for :users, :controllers => { :registrations => "registrations", :sessions => "sessions", :omniauth_callbacks => "authentications" }
ser.rb
devise :omniauthable, :database_authenticatable, :registerable, :confirmable, :recoverable, :rememberable, :trackable, :validatable
La vue:
<a href="/users/confirmation/new" data-remote="true" data-method="post">Resend confirmation</a>
Merci
Comme vous pouvez le voir sur https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L2 , la méthode HTTP de confirmation # new est GET, pas POST. Essayez de supprimer 'data-method = "post"' et voyez si cela fonctionne.
pour envoyer des instructions de confirmation à l'utilisateur, vous trouverez l'utilisateur, puis juste 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
est une méthode définie au niveau du contrôleur de contrôleur qui obtient les ressources de contrôleur spécifiques à la ressource de périphérique (utilisateur) par exemple. définition dans DeviseController
def resource_params
params.fetch(resource_name, {})
end
donc afin de passer l'e-mail en tant que paramètre, vous ne devez pas l'inclure dans un hachage utilisateur, donc dans la vue au lieu de
link_to('resend', user_confirmation_path(email: "[email protected]"), :method => :post)
insérer l'e-mail dans un hachage
link_to('resend', user_confirmation_path(user: {:email => "[email protected]"}), :method => :post)
de cette façon, devise récupérera le paramètre email
Assez vieux poste. Cependant, au lieu d'envoyer directement les instructions, vous souhaiterez peut-être simplement diriger l'utilisateur vers le flux de travail de Devise:
= link_to 'Resend confirmation', new_user_confirmation_path
Cela amènera l'utilisateur à la vue de Devise demandant l'e-mail pour envoyer les instructions de confirmation.
J'espère que ça aide n'importe qui, de toute façon. :)
Voici ma solution. J'espère ne pas manquer quelque chose dans mon commutateur dans resource_params. Remarque: non ajaxifié
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
devise_for :users, controllers: { confirmations: "confirmations" }
<%= link_to "resend confirmation", user_confirmation_path, data: { method: :post } %>
voici ma solution qui ouvrira le formulaire de conception où l'utilisateur peut entrer une adresse e-mail et demander un nouvel e-mail avec un jeton de confirmation. Toute logique de conception concernant la vérification des e-mails est préservée:
app/controllers/confirmations_controller.rb
class ConfirmationsController < Devise::ConfirmationsController
# GET /resource/confirmation/new
def new
self.resource = resource_class.new
end
end
config/routes.rb
devise_for :users, controllers: { confirmations: "confirmations" }
app/vues/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" %>
Je partage ma solution car elle est un peu différente, mais plus proche du flux d'utilisateurs normal à mon avis (rediriger vers la page de remerciements où vous avez un bouton pour renvoyer sans écrire à nouveau d'e-mail), et vous n'aurez pas à remplacer le contrôleur des confirmations.
Une fois inscrit, l'utilisateur est redirigé vers une page de remerciements. Dans registrations_controller:
def after_inactive_sign_up_path_for(resource)
session[:user_id] = resource.id
redirect_to thanks_url
end
dans le contrôleur des utilisateurs, vous utilisez simplement les instructions .send_confirmation_instructions sur l'utilisateur
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
itinéraires:
get '/thanks', to: 'users#thanks'
post '/resend_confirmation', to: 'users#resend_confirmation', as: 'resend_confirmation'
enfin, dans la vue "merci":
<%= button_to "Resend confirmation", resend_confirmation_path(:user_id => @user.id) %>
Cela pourrait être nettoyé un peu, je suis sûr, car je viens de l'écrire et je suis encore nouveau chez Rails, mais je cherchais ce genre de solutions sur Stack et je ne pouvais pas le trouver alors j'ai pensé à partager il.
Pour renvoyer l'e-mail de confirmation, vous voulez que la méthode de publication avec juste 'utilisateurs/confirmation' - pas de 'nouveau' à la fin.
Voici un formulaire qui demande l'e-mail de l'utilisateur et soumet la demande de renvoi de confirmation à Devise comme suit:
form_for(resource, url: user_confirmation_path) do |f|
.form-inputs
= f.input :email
.form-actions
= f.button :submit, "Resend"
Vous voudrez peut-être planifier cela pour qu'il s'exécute tous les soirs afin que vous n'ayez pas besoin de le regarder.
Voici un article sur la façon de le faire
http://www.cheynewallace.com/resend-devise-confirmation-emails-for-incomplete