読者です 読者をやめる 読者になる 読者になる

グロースエンジニアのブログ

プログラミングとウェブ解析をやっています。Googleアナリティクス好きなRuby on Rails エンジニアです!

【Rails5】devise でログイン後ページをユーザー意図に合わせて変更する

前回の記事でログイン後ページのリダイレクトを設定しました。

ログアウトした状態でログイン後の特定ページにいった場合、ログインページに遷移し、ログインするとその設定したページにリダイレクトされます。

しかし、その場合ユーザーとしてはログインするとそのログイン後の特定ページにリダイレクトされたいと思います。

今回はその機能を実装していきます。

ログイン前のページを保存する

以下のページで解説がありますので、そのとおりに実装していきます。

How To: Redirect back to current page after sign in, sign out, sign up, update · plataformatec/devise Wiki · GitHub

まず 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 関連記事はこちら

【Rails5】devise でログイン機能を実装する

【Rails5】devise を日本語化する

【Rails5】devise でログイン後、ログアウト後のページを設定する