Rails —“记住我”功能

| 我在理解Michael Hartl的Ruby on Rails教程中“记住我”的实现时遇到了麻烦。他使用登录方法创建了一个SessionsHelper模块,其中包含以下内容:
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),则返回用户,否则返回nil。 我无法理解为什么我们要花这么长时间来测试用户是否已经登录: 在用户登录的情况下,
@current_user
已经由
sign_in
方法定义,因此the4ѭ方法中的|| =是没有意义的。 如果用户未登录,则
current_user
方法中的|| =运算符将返回
user_from_remember_token
方法返回的值,但是由于cookies.signed [:remember_token]将为nil,因此会向
User.authenticate_with_salt
传递[nil, nil]参数,并且将返回nil,因此
current_user
方法将返回nil。 简而言之,如果
current_user
方法定义了@current_user,则返回@current_user,否则返回nil,仅使用常规的访问器方法就不会简单得多:
def current_user
    return @current_user
end
迈克尔·哈特尔(Michael Hartl)的书说,这样做将无用,因为会忘记用户的登录状态。为什么会这样呢?有人可以解释为什么我们不这样做,而是使用上面发布的更为复杂的版本吗?     
已邀请:
        线
return @current_user ||= user_from_remember_token
是一种惰性初始化的形式,可以避免在实际需要时初始化
@current_user
变量。
@current_user
永远不会在第一次调用此函数时初始化,但是它将在每个后续调用中都有一个值(假设
user_from_remember_token
返回nil以外的值)。 他本可以写
def current_user
  return user_from_remember_token
end
此代码将始终将当前用户初始化为从Cookie读取的任何内容。这样可以正确执行操作,但是他可能想避免重复读取Cookie,因此只执行一次并将其存储在变量中。 他做不到
def current_user
  return @current_user
end
因为@current_user变量不会在页面请求中持续存在。页面呈现并发送回客户端后,@current_user变量将被销毁并且其值将被遗忘。 希望这可以帮助。有关在Web应用程序中维护状态的信息,以了解为什么需要跳过这些箍的更多信息。     
        仅当您实际使用登录表单登录时,才调用“ 3”。之后,您必须使用每个请求的cookie值来设置当前用户。 因此,当用户登录并打开页面时,第一次调用
current_user
时,它将填充
@current_user
实例变量并将其用于进一步的
current_user
调用。     

要回复问题请先登录注册