web-dev-qa-db-ja.com

確認可能な工夫、クリックで確認メールを再送信する方法

確認可能なデバイスを使用しています。クリックして確認メールを再送信するためのリンクをユーザーに提供したい。問題は、ユーザーがリンクをクリックしても、デバイスのコントローラーに移動しないことです。 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>

ありがとう

27
AnApprentice

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L2 で確認できるように、confirmation#newのHTTPメソッドはGET、 POSTではありません。 'data-method = "post"'を削除して、機能するかどうかを確認してください。

6
Rodrigo Flores

確認手順をユーザーに送信するには、ユーザーを見つけて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

たとえば、デバイスリソース(ユーザー)などの特定のコントローラーリソースを取得するデバイスコントローラーで定義されたメソッドです。 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パラメータを取得します

8
bigsolom

かなり古い投稿。ただし、指示を直接送信するのではなく、Deviseのワークフローをユーザーに示すだけにすることもできます。

= link_to 'Resend confirmation', new_user_confirmation_path

これにより、ユーザーはDeviseのビューに移動して、確認の指示を送信するように電子メールを要求します。

とにかく、それが誰にも役立つことを願っています。 :)

5
Gabriel Osorio

これが私の解決策です。 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 } %>
3
benoitr

これは、ユーザーがメールアドレスを入力して確認トークン付きの新しいメールをリクエストできる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" %>
2
Karlo Smid

私の解決策は少し異なりますが、私の意見では通常のユーザーフローに近いので共有します(もう一度メールを書かずに再送信するボタンがある感謝ページにリダイレクトします)。オーバーライドする必要はありません。確認コントローラ。

サインアップ後、ユーザーは「ありがとう」ページにリダイレクトされます。 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で探していたので見つけられなかったので、共有しようと思いました。それ。

2
Lorenzo

確認メールを再送信するには、「users/confirmation」のみの投稿メソッドを使用します。末尾に「new」はありません。

次のフォームは、ユーザーのメールをリクエストし、次のように確認の再送信リクエストをDeviseに送信します。

form_for(resource, url: user_confirmation_path) do |f|
  .form-inputs
    = f.input :email
  .form-actions
    = f.button :submit, "Resend"
2
coberlin

これを毎晩実行するようにスケジュールすると、監視する必要がなくなります。

ここにそれを行う方法についての記事があります

http://www.cheynewallace.com/resend-devise-confirmation-emails-for-incomplete

1
Cheyne