1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】フレンドリーフォワード

Last updated at Posted at 2020-03-19

#フレンドリーファワード
ログインしていないユーザーが編集ボタンをクリックする際に、ログイン後にトップページではなく編集ページに飛ぶようにしたい。
そういった機能を追加できるのがフレンドリーフォワードです。

#実装

sessions_helper.rb
  def store_location
    session[:forwarding_url] = request.original_url if request.get?             
  end
users_controller.rb
    def logged_in_user                                                                
      unless logged_in
        store_location                                 
        flash[:danger] = "please login"
        redirect_to login_url                                                   
      end
    end

ユーザーのログイン時にフレンドリーフォワードを実装するにはセッションヘルパーにstore_locationを定義し、users_controller.rbにてlogged_in_userメソッドを定義します。

まずlogged_in_userでユーザーがログインしていない場合にstore_locationを実行させ、現時点のURLをsession[:forwarding_url]に保存します。

original_urlはhttp(s)以外も扱えるよう指定しています。
request.get?でGETリクエストの時だけ値を格納しているように指定しているのは、ログインしていないユーザがフォームで送信した場合にurlを転送先に保存させないためです。

sessions_helper.rb
  def redirect_back_or(default)
    redirect_to(session[:forwarding_url] || default)
    session.delete(:forwarding_url)
  end

  def store_location
    session[:forwarding_url] = request.original_url if request.get?             
  end
sessions_controller.rb
  def create
    @user = User.find_by(email: params[:session][:email].downcase)
    if @user && @user.authenticate(params[:session][:password])true
      log_in @user
      params[:session][:remember_me] == '1' ? remember(@user) : forget(@user)
      redirect_back_or @user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end

そしてセッションヘルパーにredirect_or_backメソッドを追加し、sessions_controller.rbcreateアクションにてredirect_back_or @userを追記します。

session[:forwarding_url] || defaultsession[:forwarding_url]の値がnillだった場合にdefaultになるようになっています。

session.delete(:forwarding_url)ではログイン後に指定のパスに移動した後に:forwarding_urlを削除するようにしています。
こうすることで次回ログインした時に保存していたURLに飛ぶことを防いでいます。

上記手順でフレンドリーフォワードを実装できました。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?