確認可能なデバイスを使用しています。クリックして確認メールを再送信するためのリンクをユーザーに提供したい。問題は、ユーザーがリンクをクリックしても、デバイスのコントローラーに移動しないことです。 routes.rbファイルに欠けているものはありますか?これが私のセットアップです:
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
景色:
<a href="/users/confirmation/new" data-remote="true" data-method="post">Resend confirmation</a>
ありがとう
https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L2 で確認できるように、confirmation#newのHTTPメソッドはGET、 POSTではありません。 'data-method = "post"'を削除して、機能するかどうかを確認してください。
確認手順をユーザーに送信するには、ユーザーを見つけて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
たとえば、デバイスリソース(ユーザー)などの特定のコントローラーリソースを取得するデバイスコントローラーで定義されたメソッドです。 DeviseControllerでの定義
def resource_params
params.fetch(resource_name, {})
end
メールをパラメータとして渡すには、ユーザーハッシュに含める必要があるため、ビューではなく
link_to('resend', user_confirmation_path(email: "[email protected]"), :method => :post)
メールをハッシュに挿入する
link_to('resend', user_confirmation_path(user: {:email => "[email protected]"}), :method => :post)
このようにdeviseはemailパラメータを取得します
かなり古い投稿。ただし、指示を直接送信するのではなく、Deviseのワークフローをユーザーに示すだけにすることもできます。
= link_to 'Resend confirmation', new_user_confirmation_path
これにより、ユーザーはDeviseのビューに移動して、確認の指示を送信するように電子メールを要求します。
とにかく、それが誰にも役立つことを願っています。 :)
これが私の解決策です。 resource_paramsのスイッチで何かを見逃さないようにしてください。注:ajax化されていません
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 } %>
これは、ユーザーがメールアドレスを入力して確認トークン付きの新しいメールをリクエストできるdeviseフォームを開く私のソリューションです。電子メール検証に関するすべてのデバイスロジックが保持されます。
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/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" %>
私の解決策は少し異なりますが、私の意見では通常のユーザーフローに近いので共有します(もう一度メールを書かずに再送信するボタンがある感謝ページにリダイレクトします)。オーバーライドする必要はありません。確認コントローラ。
サインアップ後、ユーザーは「ありがとう」ページにリダイレクトされます。 registrations_controller内:
def after_inactive_sign_up_path_for(resource)
session[:user_id] = resource.id
redirect_to thanks_url
end
ユーザーコントローラでは、ユーザーに.send_confirmation_instructionsを使用するだけです
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
ルート:
get '/thanks', to: 'users#thanks'
post '/resend_confirmation', to: 'users#resend_confirmation', as: 'resend_confirmation'
最後に、「感謝」ビューで:
<%= button_to "Resend confirmation", resend_confirmation_path(:user_id => @user.id) %>
これは少しクリーンアップできたと思います。今書いたばかりで、Railsはまだ新しいのですが、この種のソリューションをStackで探していたので見つけられなかったので、共有しようと思いました。それ。
確認メールを再送信するには、「users/confirmation」のみの投稿メソッドを使用します。末尾に「new」はありません。
次のフォームは、ユーザーのメールをリクエストし、次のように確認の再送信リクエストをDeviseに送信します。
form_for(resource, url: user_confirmation_path) do |f|
.form-inputs
= f.input :email
.form-actions
= f.button :submit, "Resend"
これを毎晩実行するようにスケジュールすると、監視する必要がなくなります。
ここにそれを行う方法についての記事があります
http://www.cheynewallace.com/resend-devise-confirmation-emails-for-incomplete