2

現在、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

ありがとう!私のコードについてさらに情報を知りたい場合は、お知らせください。

4

1 に答える 1