我对Rails不是很精通,但是这里是我外行对SessionsHelper中方法的理解。
首先,@current_user 是模块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(null),它会运行
||= User.find_by_remember_token(cookies[:remember_token])
它根据浏览器的 remember_token cookie 从数据库中检索 @current_user 并将其设置为 User。
最后,需要 getter 和 setter 方法,因为在方法中公开实例变量(在本例中为“sign_in”)是不好的做法?
在我看来,getter 和 setter 方法并不是完全需要的。可以在整个帮助程序中只使用@current_user。
但是,Devise (a popular user authentication gem) 在其助手中使用了current_user 方法。这个comment 也很重要。
换句话说,在“sign_in”方法中将self.current_user = user替换为@current_user = user会很糟糕?
用@current_user = user 替换它应该没有错。这个question(与上面链接的评论相同的链接)向您展示了本教程的功能是相同的。