- 更新日: 2016年11月8日
- Devise
Rails の Devise でログイン後にログインする直前のページにリダイレクトさせる
フレンドリーフォワーディングと呼ばれる機能らしいですが、ユーザーがログインした後、ログイン直前に閲覧していたページヘとリダイレクトさせる機能を実装します。セッションに直前のページURLを保存しておき、ログイン後にそのURLにリダイレクトさせます。
— 環境 —
Rails 5.0.0.1
Devise 4.2
【追記 2016/11/08】
Rails 5 + Devise 4.2 の最新バージョンで実装して動作確認を行いましたところ、正常に動作することを確認いたしました。
【追記ここまで】
— 記事初回公開時の環境 —
Rails 4.0.1
Devise 3.2.2
ApplicationController に store_location と after_sign_in_path_for を実装
Rails4 にて Devise でユーザー登録・ログイン認証・認可の機能を追加 | EasyRamble の”ログイン後のリダイレクト先の設定”の項で書いていますが、after_sign_in_path_for と after_sign_out_path_for をサインイン・サインアウト時のリダイレクト用のフックとしてオーバーライドできます。今回使うのは、after_sign_in_path_for。
また、セッションにログイン直前のURLを保存してくおくメソッドとして、store_location を定義する。store_location は、いずれかのコントローラー#アクションが実行されるに、after_filter で呼ばれるようにしておきます。
app/controllers/applictaion_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class ApplicationController < ActionController::Base # ・・・ after_filter :store_location def store_location if (request.fullpath != new_user_registration_path && request.fullpath != new_user_session_path && # request.fullpath != "/users/password" && request.fullpath !~ Regexp.new("\\A/users/password.*\\z") && !request.xhr?) session[:previous_url] = request.fullpath end end def after_sign_in_path_for(resource) if (session[:previous_url] == root_path) super else session[:previous_url] || root_path end end # ・・・ end |
【追記 2014/06/09】
1 |
request.fullpath != "/users/password" && |
の行を以下のように修正しました。
1 |
request.fullpath !~ Regexp.new("\\A/users/password.*\\z") && |
パスワードリセット機能を使う際のフレンドリーフォワーディングでバグがあったのが理由です。詳しくは以下の別エントリーに書きました。
Rails + Devise 環境でのフレンドリーフォワーディング機能を修正 | EasyRamble
【追記ここまで】
注意点など
after_sign_in_path_for(resource) メソッドで、session[:previous_url] が root_path の場合は、super を呼ぶようにします。
これは、サインアウトした状態で /users/edit(ユーザー情報編集ページ) → /users/sign_in(サインイン) → /users/edit のリダイレクト遷移を有効にするため。この遷移ですと、session[:previous_url] が root_path(/)になり、super を呼ばないとログイン後に /users/edit へリダイレクトできませんでしたので。
session[:previous_url] が root_path 以外の場合は、else で session[:previous_url] へとリダイレクトさせています。
この辺りは、好みの挙動で修正が必要です。以上で、フレンドリーフォワーディング機能の実装は終了です。
- – 参考リンク –
- How To: Redirect back to current page after sign in, sign out, sign up, update
- Rails – Deviseでログイン/ログアウト後のリダイレクト先をログイン/ログアウトする前のページにする – Qiita [キータ]
- Devise の関連記事
- RailsのDevise認証機能での実装チェックリストまとめ
- Deviseで送信されるメールのfrom(送信者メールアドレス)を変更
- Facebook の OAuth 認証で OAuthException(191)エラー
- Rails Devise でパスワードリセットなどのメールテンプレート(Mailer ビュー)をカスタマイズ
- Rails + Devise 環境でのフレンドリーフォワーディング機能を修正
- Deviseでユーザー登録完了時にウェルカムメールを送信する
- Rails Devise でユーザーがプロフィール情報を更新後に元のページにリダイレクトさせる
- Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可
- Rails Deviseの日本語化辞書ファイル(devise.ja.yml)
- Rails + Devise で admin ユーザー(管理者)を削除できないようにする
- 初回公開日: 2013年12月28日
Leave Your Message!