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

【追記 2014/06/09】

の行を以下のように修正しました。

パスワードリセット機能を使う際のフレンドリーフォワーディングでバグがあったのが理由です。詳しくは以下の別エントリーに書きました。

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] へとリダイレクトさせています。

この辺りは、好みの挙動で修正が必要です。以上で、フレンドリーフォワーディング機能の実装は終了です。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!