。次をご覧ください:
def current_user
if (user_id = session[:user_id]) # i.e., if the user is logged in (has a session w/ user's id)
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
(sessions_helper.rbから) - 具体的には、stateme NT:
if user && user.authenticated?(cookies[:remember_token])
user.authenticated?(cookies[:remember_token])
が失敗した場合、インスタンス変数@current_user
が全く割り当てられないことに注意してください。そのような場合、@current_user
の値はゼロになります。
しようと、レールコンソールで、より良いアイデアを得るために:
>> user = User.create(name: "Michael", email: "[email protected]", password: "foobar", password_confirmation: "foobar")
>> user.remember_token
=> nil
>> user.remember
>> user.remember_token
=> "68ObMQCCdjURdwH0QVEL7w"
>> token = user.remember_token
>> user.authenticated?(token)
=> true
>> user.update_attribute(:remember_digest, User.digest(User.new_token))
>> user.authenticated?(token)
=> false
を最後の行=> true
ようにするには:
>> user.remember
>> new_token = user.remember_token
>> user.authenticated?(new_token)
=> true
今すぐremember
法以来、session_helper_test.rbで振り返りますがセットアップで呼び出されますが、テストブロックの@user.update_attribute(:remember_digest, User.digest(User.new_token))
の後ではなく、user.authenticated?(user.remember_token)
が失敗することが予想されます。その結果、if user && user.authenticated?(cookies[:remember_token])
という文はfalse
になります。したがって、@current_user
には決して値が与えられないので、nil
になります。
'' 'remember(@user)' 'メソッドはすでにクッキーに' 'remember_digest'''と' 'remember_token'''を作成しています。 '' remember_digest'''が新しい情報で更新されると、 '' 'remember_token'''との一致はなくなります。 ちょうど推測です。私はまだかなり混乱しています。私は初心者ですが、まだ多くを把握しなければなりません;-) –