2種類のユーザ権限があるサービスで、ログイン状態かsign_up(登録)画面にした際に、想定してなかった画面にいリダイレクトされてこまったという話
構成
hoge_user, fuga_userという2種類のユーザがあります。それぞれ個別の認証が必要です。
また、それぞれのnamespaceでroot設定しています。
# routes.rb
namespace :hoge_users do
root to: 'tops#show'
~略~
end
namespace :fuga_user do
root to: 'tops#show'
~略~
end
さらに、親のルートではhoge_userのルートに遷移するように設定しています。
問題
fuga_userでログイン済状態でfuga_userのsign_up(登録)画面に遷移しようとするとhoge_userトップにリダイレクトされてしまう。
ログを見ると以下のように遷移していました。
-
fuga_user/new(sign_up) /hoge_user/top
ログイン済の場合親のルートにリダイレクトされたため、そこから更にhoge_userルートにリダイレクトされてました。
想定としては各ユーザのルート設定したとこにリダイレクトされると思ってたので困った。
調査
deviseのコードを確認しました。
- newでは
require_no_authenticationが呼ばれログイン状態を確認する - ログイン済なら
after_sign_in_path_forを呼ばれる
なるほど。after_sign_in_path_forをoverrideしてないので親ルートにリダイレクトされると。
しかもこのアプリ構成上application_controllerではなく個別のcontrollerでoverrideする必要がある。
→ 2種類のそれぞれのリダイレクト先を設定したいので
→ session_controllerではすでにやってた。今回はregistration_conroller
対応
全然DRYじゃないんだけど、それぞれのユーザ配下のsession_controller, registration_controllerで after_sign_in_path_for をoverrideした。
これ以上増えるようだったらmixinするなり共通化します。