その他
    ホーム技術発信DoRubydevise ログイン後のリダイレクトについて(GET編)

    devise ログイン後のリダイレクトについて(GET編)

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    Rails の Devise でログイン後はログインする直前のGETリクエストにリダイレクトさせます。

     デフォルトの動き

    before_action :authenticate_user!を通して、ログイン画面に遷移する場合、ログイン後、ログイン直前の画面に戻します。

    下記のようなredirect_toを利用して、ログイン画面に遷移する場合、ログイン後、元の画面に戻らなくて、root_pathに遷移します。

    unless user_signed_in?

    redirect_to new_user_session_path

     対策

    ログイン直前のリクエストをセッションに保存しておいて、

    ログイン成功後のafter_sign_in_path_forメソッドをオーバーライドして、戻る先をセッションから取得して設定します。

    注意:ログイン関連のリクエストをセッションに入れないこと。

     ログイン直前のリクエストをセッションに保存

    applictaion_controller.rb

    class ApplicationController < ActionController::Base
      after_action  :store_location
      def store_location
        if (request.fullpath != "/users/sign_in" &&
            request.fullpath != "/users/sign_up" &&
            request.fullpath !~ Regexp.new("\\A/users/password.*\\z") &&
            !request.xhr?) # don't store ajax calls
          session[:previous_url] = request.fullpath 
        end
    end
    

     deviseのリダイレクをカスタマイズ

    devise標準のafter_sign_in_path_forをオーバーライドして、ログイン後のリダイレクト先はカスタマイズします。

    SessionsControllerをカスタマイズしなければ、applictaion_controller.rbに追加します。

    SessionsControllerをカスタマイズすれば、カスタマイズしたコントローラ中に追加します。

    class UsersSessionsController < Devise::SessionsController
      ・・・
      def after_sign_in_path_for(resource)
        if (session[:previous_url] == root_path)
          super
        else
          session[:previous_url] || root_path
        end
      end
    end
    

     参照

    https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update

    http://easyramble.com/friendly-forwarding-redirect-on-devise.html