web-dev-qa-db-fra.com

Concevoir confirmable, comment renvoyer un e-mail de confirmation en un clic?

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

27
AnApprentice

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.

6
Rodrigo Flores

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
28
MZaragoza
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

8
bigsolom

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

5
Gabriel Osorio

Voici ma solution. J'espère ne pas manquer quelque chose dans mon commutateur dans resource_params. Remarque: non ajaxifié

contrôleur de confirmation

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

itinéraires

devise_for :users, controllers: { confirmations: "confirmations" } 

vue

<%= link_to "resend confirmation", user_confirmation_path, data: { method: :post } %>
3
benoitr

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" %>
2
Karlo Smid

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.

2
Lorenzo

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"
2
coberlin

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

1
Cheyne