deviseでログイン状態からsign_up(登録)画面に遷移した際のリダイレクト先


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_controllerafter_sign_in_path_for をoverrideした。

これ以上増えるようだったらmixinするなり共通化します。