62
68

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-08-25

はじめに

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 

上記を追加します。

62
68
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
62
68