Michael HartlのRuby on Railsチュートリアルの "Remember Me"の実装を理解するのに問題があります。彼は次のことを含む、ログインするための方法でSessionsHelperモジュールを作成します。Rails - "remember me"ケイパビリティ
module SessionsHelper
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
current_user = user
end
def current_user=(user)
@current_user = user
end
def current_user
return @current_user ||= user_from_remember_token
end
private
def user_from_remember_token
#passes array of length two as a parameter -- first slot contains ID,
#second contains SALT for encryption
User.authenticate_with_salt(*remember_token)
end
def remember_token
#ensures return of a double array in the event that
#cookies.signed[:remember_token] is nil.
cookies.signed[:remember_token] || [nil,nil]
end
end
注:Userモデルにおけるauthenticate_with_salt
方法は、最初のパラメータ(ID)によってユーザを見つけ、ユーザーがある場合そのsaltが2番目のパラメータ(salt)に等しい場合、ユーザが返されます。そうでない場合はnilが返されます。
:ユーザーがログインした場合には
、@current_user
すでにsign_in
方法によって定義され、したがって、current_user
メソッドの|| =は無意味です。 【:remember_token】ゼロとなり、User.authenticate_with_salt
が渡されるユーザーが署名されていない、current_user
方法で|| =オペレータがuser_from_remember_token
メソッドによって返される値を返すが、cookies.signedのでた場合には
[nil、nil]引数を指定してnilを返すので、current_user
メソッドはnilを返します。要するに
、それが定義されている場合current_user
方法は@current_userを返している場合はnil、それ以外の場合は、単に従来のアクセサメソッドを使用するためにはるかに簡単ではないでしょう。
def current_user
return @current_user
end
マイケル・ハートルの本はと言いますユーザーのサインイン状態が忘れられるため、これを行うことは役に立たないでしょう。なぜそれは事件だろうか?誰かが私たちがこれをしない理由を説明し、代わりに上記のより複雑なバージョンを使用することができますか?
しかし、@ current_userがsign_inによって設定された後は、そこにはいないのですか?なぜ、私たちは単にクッキーの代わりにインスタンス変数@current_userを使用できないのですか?彼らの主な違いは何ですか? – Kvass
マイケル・ベナブル氏の答えによると、「@current_user変数はページリクエストを超えて保持されない」だから、ページリクエストで 'current_user'メソッドを初めて使うときは、そのクッキーからユーザ情報を取得する必要があります。 – vesan