我对 Rails 不是很精通,但这是我外行对SessionsHelper
.
首先,@current_user
是 module 的一个实例变量SessionsHelper
。这意味着它对于后续调用SessionsHelper
.
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
因此,通过使用“self”而不是“current_user”,current_user 已成为 Session 的一部分,但尚未存储在数据库中,对吗?
self.current_user = user
不会使“current_user”成为任何东西的一部分。
self
指的是它自己,SessionsHelper。
self.current_user =
有效地调用它自己的方法,setter 方法,def current_user=(user)
.
如果是这样的话,清单 8.22 中列出的方法是 getter 和 setter 方法,对吗?
是的。
def current_user=(user) # Setter.
@current_user = user
end
第一个将 current_user 存储在数据库中,
不会。第一种方法 ,current_user=
不会将任何内容存储到数据库中。它所做的只是将实例变量设置为. @current_user
user
def current_user # Getter.
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
第二个根据需要检索它?
第二种方法,current_user
,返回一个现有 @current_user
值。
如果@current_user
是nil
(空),它运行
||= User.find_by_remember_token(cookies[:remember_token])
它根据浏览器的remember_token cookie从数据库中检索并设置@current_user
为。User
最后,需要 getter 和 setter 方法,因为在方法中公开实例变量(在本例中为“sign_in”)是一种不好的做法?
在我看来,getter 和 setter 方法并不是完全需要的。可以@current_user
在整个助手中使用。
但是,Devise(一种流行的用户身份验证 gem)current_user
在其助手中使用了该方法。这个评论也很相关。
换句话说,在“sign_in”方法中替换: self.current_user = user
with会很糟糕?@current_user = user
用 . 替换它应该没有错@current_user = user
。这个问题(与上面的链接评论相同的链接)向您展示了本教程的功能是相同的。