LoginSignup
0
0

More than 1 year has passed since last update.

フレンドリーフォアーディング機能に挑戦してみた。

Last updated at Posted at 2022-11-01

フレンドリーフォアーディング機能とは

ログインしないままサイトを閲覧していて、気になる投稿があったから
ふとコメントしようとしたら、ログインが必要でログインページに遷移される、
なんてことはままあったりします。
さて、そんな時、ログインした後にまたTOPページに戻るとしたらめんどくさくないですか?
いやー、最後にいたページに戻してよー、ってなると思います。

その願いを叶えてくれるのがこのフレンドリーフォアーディング機能です。
簡単に言うと、ログイン前にいたページに戻してくれる機能といったところでしょうか。

ちなみにDeviseを使用していることが条件のようです。

実装してみた

今回のフレンドリーフォアーディング機能の実装にはほぼこちらの記事にお世話になってます。
この記事をベースに実装しましたのでよければご参照を!

https://techtechmedia.com/friendly-forwarding-devise/

・ApplicationControllerの編集
app/controller/appliation_controller.rb
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の編集
app/controller/session_controller/rb
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ってなんだろう?ってなった方は以下記事参照ください。

https://techtechmedia.com/super-overwrite-ruby/

これで完成!かと思いきや。サーバー起動したらまさかのAugument errorが...
エラー文によるとsession controllerにて引数が足りないと物申されています。

app/controller/session_controller/rb
:
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

0
0
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
0
0