2014-11-10 3 views
0

OK,이 장을 마쳤으므로 모든 코드가 올바르게 동작합니다. 그러나 나는 1 비트 정도 혼란 스럽다. sessions_helper_test에서 토큰 쿠키 기억을 직접 설정했습니다. is_logged_in에 대한 테스트? 통과, 비록 is_logged_in? 세션 만 검사합니다.레일 튜토리얼 8 장 : is_logged_in은 어떻게 작동합니까? 패스?

require 'test_helper' 

class SessionsHelperTest < ActionView::TestCase 

    def setup 
    @user = users(:michael) 
    remember(@user) 
    end 

    test "current_user returns right user when session is nil" do 
    assert_equal @user, current_user 
    assert is_logged_in? 
    end 

    test "current_user returns nil when remember digest is wrong" do 
    @user.update_attribute(:remember_digest, User.digest(User.new_token)) 
    assert_nil current_user 
    end 
end 

class ActiveSupport::TestCase 
    # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 
    fixtures :all 
    include ApplicationHelper 

    # Add more helper methods to be used by all tests here... 

    def is_logged_in? 
    !session[:user_id].nil? 
    end 
    ... 
end 


module SessionsHelper 

    def log_in(user) 
    session[:user_id] = user.id 
    end 

    # Remember user in persistent session 
    def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
    end 
    ... 
end 

class User < ActiveRecord::Base 
    ... 
    def remember 
    self.remember_token = User.new_token 
    update_attribute(:remember_digest, User.digest(remember_token)) 
    end 
    ... 
end 

누구든지 설명 할 수 있습니까?

답변

3

'remember (@user)'는 세션이 null 일 때 사용자를 반환하기 위해 'current_user'메소드에서 사용하는 쿠키를 작성한다는 것을 이해했습니다. 이 책에서

assert_equal @user, current_user 

가 여기 CURRENT_USER 코드입니다 :

module SessionsHelper 
    . 
    . 
    . 
    # Returns the user corresponding to the remember token 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]) 
     user = User.find_by(id: user_id) 
     if user && user.authenticated?(cookies[:remember_token]) 
     log_in user 
     @current_user = user 
     end 
    end 
    end 
    . 
    . 
    . 
end 

사용자가 remember_token 쿠키를 사용하여 인증을 통과 것 같아요 위의 코드에서, "log_in"방법이다라고 "세션 [: user_id]"설정하기

+0

남자! 나는 내가 어떻게 이것을 놓쳤는 지 전혀 모른다. 감사 :) –