【Rails5】devise でログイン後ページをユーザー意図に合わせて変更する
前回の記事でログイン後ページのリダイレクトを設定しました。
ログアウトした状態でログイン後の特定ページにいった場合、ログインページに遷移し、ログインするとその設定したページにリダイレクトされます。
しかし、その場合ユーザーとしてはログインするとそのログイン後の特定ページにリダイレクトされたいと思います。
今回はその機能を実装していきます。
ログイン前のページを保存する
以下のページで解説がありますので、そのとおりに実装していきます。
まず app/controllers/application_controller.rb に以下を追記します。
class ApplicationController < ActionController::Base
before_action :store_current_location, unless: :devise_controller?
before_action :authenticate_user!
...
private
def store_current_location
store_location_for(:user, request.url)
end
end
これでログイン前のページが保存されます。
ログイン後のリダイレクトを修正
次に以下のようにしてログイン後のリダイレクトを先ほどの保存したログイン前ページを使うように修正します。
def after_sign_in_path_for(resource)
stored_location_for(resource) || mypage_root_path
end
ログイン不要ページを除く
この設定でほぼOKなんですが、ログインが不要なページからログインページに遷移した場合もこの機能が働きます。
例えば、トップからログインページに遷移した場合、ログイン後はトップに戻ります。しかし、ここではログイン後のトップ(上記例では mypage_root_path)に遷移させたいと思います。
なので、その設定を行います。なお、ここではログイン不要のページ(トップページ)を home_controller で設定しているとします。
class ApplicationController < ActionController::Base
before_action :store_current_location, unless: :devise_or_home_controller?
before_action :authenticate_user!
...
private
...
def devise_or_home_controller?
devise_controller? || controller_name == 'home'
end
end
これで home_controller は保存されなくなり、意図通り mypage_root_path に遷移します。 controller_name == 'home' の部分はもう少しやりようがある気がしてますが、ひとまず、これで動きます。
それ以外でいい方法があれば教えてください!
ということで今回はここまで。
devise 関連記事はこちら