現在、devise/omniauth を使用しています。Facebook/Twitter でサインアップした後、「verify-email」というページにリダイレクトして、メール アドレスが正しいことを確認できるようにしたいと考えています。
私は今、localhost:3000/users/verify-email
ページを機能させようとしています。その URL にアクセスすると、次のエラー メッセージが表示されます。
パス「/users/update_email」のデバイス マッピングが見つかりませんでした。これは 2 つの理由で発生する可能性があります: 1) ルートをスコープ ブロック内にラップするのを忘れた。例: devise_scope :user do get "/some/route" => "some_devise_controller" end 2) ルーターをバイパスして Devise コントローラーをテストしています。その場合、Devise にどのマッピングを使用するか明示的に伝えることができます: @request.env["devise.mapping"] = Devise.mappings[:user]。
だからここに私のroutes.rbがあります:
Rails.application.routes.draw do
...
devise_for :users, :controllers => {
omniauth_callbacks: 'custom_devise_controllers/omniauth_callbacks',
registrations: 'custom_devise_controllers/registrations' }
devise_scope :users do
get "users/verify_email" => 'custom_devise_controllers/registrations#verify_email'
end
...
end
スコープ ブロックでルートを間違ってラップしているとは思いません (これは、エラー メッセージの 1 番目で説明されていることです)。それは、どのマッピングを使用するかを明示的にDeviseに伝える必要があるということですか(これはエラーメッセージの#2に関するものです)? エラーメッセージには、これでどのマッピングを使用する@request.env["devise.mapping"] = Devise.mappings[:user].
かをdeviseに伝えることができると書かれています。それとも、何か他のことが起こっていると思いますか?
「custom_devise_controllers/registrations_controller.rb」を含めます。
class CustomDeviseControllers::RegistrationsController < Devise::RegistrationsController
def update
@user = User.find(current_user.id)
successfully_updated = if needs_password?(@user, params)
@user.update_with_password(devise_parameter_sanitizer.sanitize(:account_update))
else
params[:user].delete(:current_password)
@user.update_without_password(devise_parameter_sanitizer.sanitize(:account_update))
end
if successfully_updated
set_flash_message :notice, :updated
sign_in @user, :bypass => true
redirect_to after_update_path_for(@user)
else
render "edit"
end
end
def after_sign_up_path_for(resource)
users_update_email_path
end
def verify_email
end
private
def needs_password?(user, params)
params[:user][:password].present? || params[:user][:password_confirmation].present?
end
end
ありがとう!私のコードについてさらに情報を知りたい場合は、お知らせください。