rails7+deviseでログイン後にログイン前のページに戻る実装

目次

マーケター、エンジニアを月1時間からジョインできるプラットフォーム

airteamは月1時間からマーケターやエンジニアに相談できるプラットフォーム。 雇うのはハードル高いけどプロをチームに入れたい。そんな経営者のためのサービスです。 相談にのる方も募集しています。

タスクなしだから月一時間からジョイン可能

作業はなくオンライン相談メイン。 月1時間からさっと経験者に継続的に相談できます。

多様な経験者を雇用するより何倍も早くチームに

あらゆるジャンルの経験者がいるので あなたのチームのノウハウの選択肢が広がります。

NDAはすでに締結済み、契約もスムーズ

契約の煩雑なやりとりはなく、NDAはすでに締結済み、書面のやりとりはありません。

どこかのページを見てユーザー登録をしたあとにそのページにすぐに戻りたいことありますよね?(ね?)今回はrails7とdeviseでの実装で登録後にすぐに登録前に見ていたページに戻る方法をまとめていきます。

全体の流れ

  • ログインページの遷移元をセッションに保存
  • リファラがあったらリダイレクトするようにdeviseをオーバーライド

前ページのリファラを保存

下記でリファラを保存。SessionsControllerはdeviseのcontrollerを生成。

class Users::SessionsController < Devise::SessionsController

  def new
    session[:previous_url] = request.referrer
    super
  end

  protected

  def after_sign_in_path_for(resource)
    session.delete(:previous_url) || super
  end
end
  • セッションの作成: ユーザーがログインページにアクセスしたとき、new アクションがトリガーされ、ユーザーがそのページに来る前のURL(request.referrer)がセッションに :previous_url キーとして保存されます。
  • ログイン後のリダイレクト: ユーザーがログインに成功した後、after_sign_in_path_for メソッドが呼ばれます。このメソッドでは、セッションに保存されたURLがあれば、そこにリダイレクトし、なければDeviseのデフォルトのリダイレクト先(例えばユーザーのプロフィールページ)に戻ります。

session.delete

session.delete(:previous_url): これはRubyのHashから特定のキーを削除し、そのキーに紐づいていた値を返すメソッドです。この場合、セッション(実質的には一種のHash)から :previous_url キーを削除し、その値を取得します。

リダイレクトの処理: after_sign_in_path_for メソッド内で、session.delete(:previous_url) の結果(つまり、:previous_url に紐づいていた値)が存在すれば、そのURLにリダイレクトします。存在しない場合は super(Deviseのデフォルトのリダイレクト処理)が実行されます。

つまり、session.delete(:previous_url) はセッションから値を削除すると同時にその値を取得し、その後の条件分岐でリダイレクト先が決定される流れになります。もしセッションに :previous_url が存在していれば、そのURLにリダイレクトし、存在しなければDeviseの標準のリダイレクト先に進みます。

routes

routesを下記に

  devise_for :users, controllers: { 
    sessions: 'users/sessions'
  }

上記でsessionは指定され、それ以外はデフォルトのrouteになる。