フレンドリーフォアーディング機能とは
ログインしないままサイトを閲覧していて、気になる投稿があったから
ふとコメントしようとしたら、ログインが必要でログインページに遷移される、
なんてことはままあったりします。
さて、そんな時、ログインした後にまたTOPページに戻るとしたらめんどくさくないですか?
いやー、最後にいたページに戻してよー、ってなると思います。
その願いを叶えてくれるのがこのフレンドリーフォアーディング機能です。
簡単に言うと、ログイン前にいたページに戻してくれる機能といったところでしょうか。
ちなみにDeviseを使用していることが条件のようです。
実装してみた
今回のフレンドリーフォアーディング機能の実装にはほぼこちらの記事にお世話になってます。
この記事をベースに実装しましたのでよければご参照を!
・ApplicationControllerの編集
class ApplicationController < ActionController::Base
before_action :store_user_location!, if: :storable_location? ①
private
def storable_location? ①
request.get? && is_navigational_format? && !devise_controller? && !request.xhr?
end
def store_user_location!
store_location_for(:user, request.fullpath) ②
end
:
「現在のページ」にリダイレクトするには、現在のURLをセッションに保存し、
ユーザーが認証した後にセッションからURLを取得する流れが含まれます。
これはGETリクエストに対してのみ行われるようです。
①この"storable_location"でGET/Devise/Ajaxじゃないなどを判定をします。
以下の条件が当てはまらない場合のみ、sessionに現在のfullpathを保存します。
・getメソッドではない
・Deveiseコントローラーで表示される画面
・Ajaxでの遷移
②"request.fullpath"で好きなものに置き換えることができるようです。
"request.fullpath"はRailsドキュメントの公式によると、
最後にリクエストされたURLのパラメターを含むフルパスだそう。
これでユーザーは最後に閲覧したページにリダイレクトされるんですね。
・session controllerの編集
class Public::SessionsController < Devise::SessionsController
def after_sign_in_path_for(resource_or_scope)
stored_location_for(resource_or_scope) || super
end
:
ログイン後のpathを、先ほどsessionに保存したpathにsuperを使用してオーバーライドします。
superってなんだろう?ってなった方は以下記事参照ください。
これで完成!かと思いきや。サーバー起動したらまさかのAugument errorが...
エラー文によるとsession controllerにて引数が足りないと物申されています。
:
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_in) ←
end
:
configure_permitted_parametersは、devise利用の機能
(新規登録やログイン認証など)が使われる場合に実行されます。
この引数の(:sign_in)を私が記述するのを忘れてまして、引数がないために
「いや一体なにに対して許可すればいいのよ」って怒られてました。
こちらを追加で記述したところ、無事エラー解消し機能実装することができました!
以下参考にさせていただいた記事です。
https://zenn.dev/akhmgc/articles/d99bd7438c3f38
https://github.com/heartcombo/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update