我是Rails的新手,并且经历了Michael Hartl的Rails教程。到目前为止,我已经能够理解教程中的所有内容,但现在我认为我在第8章的中途陷入困境。我想要更有经验的Rails程序员的一些确认,我正在按照作者的正确解释。我在具体谈论下面的Chapter 8, Section 8.2.3:
在8.2.3节中,“sign_in”方法有一行:
self.current_user = user
因此,通过使用“self”而不仅仅是“current_user”,current_user已成为Session的一部分,但尚未存储在数据库中,是否正确?
如果是这种情况,Listing 8.22中列出的方法是getter和setter方法,对吗?第一个将current_user存储在DB中,第二个是根据需要检索它?
最后,需要getter和setter方法,因为它在方法中暴露实例变量的不良做法(在本例中为“sign_in”)?换句话说,替换是不好的:
self.current_user = user
带
@current_user = user
“sign_in”方法中的?
我感谢任何帮助和建议。 谢谢。
答案 0 :(得分:-1)
我对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(与上面链接的评论相同的链接)向您展示了本教程中的功能相同。