前回、deviseでのログイン後のページ遷移先を指定する際の個人的な注意点を書きました。
ここではヘルパーメソッド実装における大前提を見逃していた、という単純に私の無知ゆえの失敗だったわけですが、今度は「ユーザー登録後のページ遷移ができない」という謎に直面したので、その解決策をメモしておきます。
deviseにおけるリダイレクト先の設定
deviseを導入後、リダイレクト先を設定するには、コントローラにてコメントアウトされている専用のメソッドを有効化してURLヘルパーを記載する、というのがこれまで私が把握していた流れ。
そこで今回も、登録時のコントローラである「resistrations_controller.rb」に以下のように変更を加えていきました。
# 変更前
# The path used after sign up.
# def after_sign_up_path_for(resource)
# super(resource)
# end
# 変更後
# The path used after sign up.
def after_sign_up_path_for(resource)
user_path(resource)
end
しかし、変更後にユーザー登録をしてみても、ルートページに飛んでしまい、意図したページ(ユーザー詳細ページ)に遷移しませんでした。
ルーティングの設定が必要
調べてみると、なんとdevise_forのルーティングに追加で設定が必要とのこと。
最終的には以下の通り変更しました。
# 変更前
Rails.application.routes.draw do
devise_for :users
resources :users
get 'users/' => 'users#index'
get 'users/:id' => 'users#show'
end
# 変更後
Rails.application.routes.draw do
devise_for :users, controllers: {
registrations: 'users/registrations'
}
resources :users
get 'users/' => 'users#index'
get 'users/:id' => 'users#show'
end
devise_forでusersモデルにcontrollersの設定を追加しています。
こうすることで、usersモデルに対して、users/resistrations内のコントローラが割り当てられるようになるのだとか。
デフォルトでは「devise/⚪︎⚪︎」のコントローラを使ってしまうみたいですね。コメントアウトを外せば有効化できるのだと思っていました、、、
一方で、ログイン後のリダイレクトを指定する場合には、after_sign_in_path_forメソッドを「application_controller.rb」内に記述していたので、この設定が不要だった、ということみたいです。
devise内の仕組みはまだ全然把握できていませんが、ちょっとだけ仕様がわかってきたような気がします。