#はじめに
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でもともと設定されているメソッドもすべて利用できます。
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になっていると、これから定義するメソッドが反映されません。
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
となり、コントローラのカスタマイズが反映されるようになります。
#②. メソッド定義
・アカウント登録後
・アカウント編集後
のリダイレクト先を指定する場合、
#アカウント登録後のリダイレクト先
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 と書いてください。登録直後はアカウントがまだ有効になっていないからです。
・ログイン後
・ログアウト後
のリダイレクト先を指定する場合、
#ログイン後のリダイレクト先
def after_sign_in_path_for(resource)
リダイレクト先のパス
end
#ログアウト後のリダイレクト先
def after_sign_out_path_for(resource)
リダイレクト先のパス
end
上記を追加します。