【Rails】sorcery - require_login

内容

Ruby on Railsgem 'sorcery'
ライブラリーメソッドrequire_loginについて

ソースコード追跡

def require_login
  return if logged_in? 
  # ① ログインしている場合は処理中止(Guard節)

  if Config.save_return_to_url && request.get? && !request.xhr? && !request.format.json? 
  # ② request
    session[:return_to_url] = request.url
    # ③ sessionのreturn_to_urlキーにリクエストURLを格納
  end

  send(Config.not_authenticated_action)
  # ④ selfを省略している?
  # ⑤ not_authenticated_actionについて
end

① return ifによるGuard節

logged_in?がtrueの場合、
require_loginメソッドは処理されません

② request

request
Sorceryのソースコードの中のどこにも定義されていないと思いきや
Railsでデフォルトで定義されていました

③sessionのrequest_to_urlキーにリクエストURLを格納する

session[:request_to_url]がいつの間に出てきましたが、
sessionのキーの名前は自由につけれるんですね

④ selfを省略している?

self.send(Config.not_authenticated_action)

の略だと思いますが、
selfの要否の判別がいまいちできていないので、よくわかりません(= =;)

⑤ not_authenticated_actionについて

send(Config.not_authenticated_action)

のsendメソッドの引数Config.not_authenticated_actionについては
Sorcery::Controller::Configに書いてあります。

module Sorcery
  module Controller
    module Config
      class << self
        ...
        # what controller action to call for non-authenticated users.
        attr_accessor :not_authenticated_action
        ...
        
        def init!
          @defaults = {
            ...
            :@not_authenticated_action             => :not_authenticated,
            ...
          }
        end

@defaultsのキー@not_authenticated_actionの値として
:not_authenticatedが定義されています。

つまり、
require_loginの中身のsend(Config.not_authenticated_action)
実行されたとき、
Module: Sorcery::Controller::InstanceMethods#not_authenticatedが実行されます。

def not_authenticated
  redirect_to root_path
end

まとめ

Ruby on Railsgem 'sorcery'で使うことのできる
require_loginメソッドについて
・ログインしていないユーザーに対して発火します
・require_loginメソッドが発火した後、not_authenticatedメソッドが発火します。


・内部処理でsession[:request_to_url]として
 リクエストしたURLが保存してあるので、
 not_authenticatedでログインしていないとして弾かれた後も
 ログインした後、リクエストした後のURLへ遷移させる
 というような実装もできそうですね

Tips

require_loginメソッドが発火した後の処理として
not_authenticatedメソッド以外を指定することも可能です。