【Devise】アカウント登録、ログイン/ ログアウト、アカウント編集後のリダイレクト先の変更


はじめに

Deviseのインストール時、アカウント登録後などのリダイレクト先は自動的に指定されます。

このデフォルトのリダイレクト先を変更するためには、コントローラをカスタマイズする必要があります。

①コントローラを作成し、ルーティングを変更する
②作成したコントローラで、メソッドを定義する
という流れで実装します。
※②で紹介するメソッドをapp/controllers/applictaion_controller.rbで定義するだけでもリダイレクト先を変えることはできます。しかし、今後似たようなメソッドを定義していくとapplictaion_controllerが肥大化してしまいます。それを防ぐためにも今回は、
『メソッドはなるべく個々のコントローラで定義し、複数のコントローラで使い回すメソッドのみapplication_controllerで定義する』
という方針にします。

実行環境

この記事は以下の環境で動作確認しています。
ruby (2.3.7)
rails (5.2.3)
devise (4.6.2)

①.コントローラ作成、ルーティング設定

ターミナルなどで以下のコマンドを実行

$ rails g devise:controllers users

これで、registration_controller, sessions_controller,.....などのコントローラがapp/controllers/usersの下に作成されます。
ここで作成されたコントローラを編集することでリダイレクト先を変更します。

ちなみに、先程作成したコントローラは、deviseで設定されているコントローラクラスを継承しています。したがって、deviseでもともと設定されているメソッドもすべて利用できます。

app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController

と記述されていることからも、継承されていることがわかります。

rails routes コマンドを実行すると

Prefix Verb     URI Pattern         Controller#Action
new_user_session GET      /users/sign_in(.:format)             devise/sessions#new
user_session POST       /users/sign_in(.:format)            devise/sessions#create
・・・
new_user_registration GET      /users/sign_up(.:format)        devise/registrations#new

のように表示されると思います。
このように、Controller#Actionが devise/registrations,devise/sessionsになっていると、これから定義するメソッドが反映されません。

config/routes.rb
devise_for :users, controllers: {   registrations: 'users/registrations',
                                    sessions: 'users/sessions' }

と設定すれば、

Prefix Verb     URI Pattern         Controller#Action
new_user_session GET      /users/sign_in(.:format)              users/sessions#new
user_session POST         /users/sign_in(.:format)              users/sessions#create
・・・
new_user_registration GET      /users/sign_up(.:format)         users/registrations#new

となり、コントローラのカスタマイズが反映されるようになります。

②. メソッド定義

・アカウント登録後
・アカウント編集後
のリダイレクト先を指定する場合、

app/controllers/users/registrations_controller.rb
#アカウント登録後のリダイレクト先
def after_sign_up_path_for(resource)
  リダイレクト先のパス(root_pathとかusers_pathとか)
end

#アカウント編集後のリダイレクト先
def after_update_path_for(resource)
  リダイレクト先のパス
end

上記を追加します。

※リダイレクト先のパスを users_path(resource) とすると、登録後にユーザーの個人ページにリダイレクトされるようになります。

※ユーザー登録にメール認証を導入してくれる confirmableモジュール を有効にしている場合は、
after_sign_up_path_for ではなく after_inactive_sign_up_path_for と書いてください。登録直後はアカウントがまだ有効になっていないからです。

・ログイン後
・ログアウト後
のリダイレクト先を指定する場合、

app/controllers/users/sessions_controller.rb
#ログイン後のリダイレクト先
def after_sign_in_path_for(resource)
  リダイレクト先のパス
end 
#ログアウト後のリダイレクト先
def after_sign_out_path_for(resource)
  リダイレクト先のパス
end 

上記を追加します。