#フレンドリーファワード
ログインしていないユーザーが編集ボタンをクリックする際に、ログイン後にトップページではなく編集ページに飛ぶようにしたい。
そういった機能を追加できるのがフレンドリーフォワードです。
#実装
def store_location
session[:forwarding_url] = request.original_url if request.get?
end
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を転送先に保存させないためです。
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
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.rb
のcreateアクション
にてredirect_back_or @user
を追記します。
session[:forwarding_url] || default
でsession[:forwarding_url]
の値がnillだった場合にdefault
になるようになっています。
session.delete(:forwarding_url)
ではログイン後に指定のパスに移動した後に:forwarding_url
を削除するようにしています。
こうすることで次回ログインした時に保存していたURLに飛ぶことを防いでいます。
上記手順でフレンドリーフォワードを実装できました。