# 記憶トークンcookieに対応するユーザーを返す
def current_user
#現在ログイン中のユーザを返す(いる場合)
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
#ここでわざと例外処理を発生させる。
raise #テストがパスすれば、この部分がテストされちない事がわかる。
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
#永続的セッションを破棄する。
def forget(user)
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
require 'test_helper'
class SessionsHelperTest < ActionView::TestCase
##(1)fixtureでuser変数を定義する
def setup
#@user = users(:michael)
##(2)渡されたユーザーをrememberメソッドで記憶する
remember(@user)
end
##(3)current_userが、渡されたユーザーと同じであることを確認します
test 'current_user returns right user when session is nil' do
assert_equal @user, current_user
assert is_logged_in?
end
##(4)ユーザーの記憶ダイジェストが記憶トークンと正しく対応していない場合に現在のユーザーがnilになるかどうかをチェックしています
test 'current_user returns nil when remembe digest is wrong' do
@user.update_attribute(:remember_digest, User.digest(User.new_token))
assert_nil current_user
end
end
やった事
authenticated?
メソッドでBCrypt::Password.new(nil)
となり、例外処理が発生してエラーが起きる。わかった事
改めてsessionとcookiesの違い。
remember token
を使った発展的なログイン機構(remember機能)remember
メソッドで記憶トークン (remember token) を生成し、cookiesメソッドによる永続的cookiesの作成や、安全性の高い記憶ダイジェスト (remember digest) によるトークン認証にこの記憶トークンを活用します。手順
実際の処理
permanent
メソッドpermanent
メソッドである。これは以下のような
permanentメソッド
でも同じ事ができる。signed
メソッド三項演算子
テストでユーザがログインするようにする。
ということもできる。 https://github.com/Fendo181/RoRTutorial_chap04/issues/33#issuecomment-313633230
Rememberテスト
current_userメソッドのテスト
実際のコード
わからなかった事
def current_user
メソッド周りは複雑なので、ちゃんと理解できていない。