我是Rails新手,一直在看Michael Hartl的Rails教程。到目前为止,我已经能够理解教程中的所有内容,但现在我觉得我在第8章中途卡住了。我希望从更有经验的Rails程序员那里得到一些确认,以确保我正确地遵循了作者的解释。我指的是下面第8章第8.2.3节:
在第8.2.3节中,"sign_in"方法有这样一行:
self.current_user = user
所以通过使用"self"而不是"current_user",current_user已经成为会话的一部分,但还没有存储在数据库中,正确吗?
如果是这种情况,清单8.22中列出的方法是getter和setter方法,对吗?第一个在数据库中存储current_user,第二个在需要时检索它?
最后,getter和setter方法是必需的,因为在方法中公开实例变量是不好的做法(在本例中为"sign_in")?换句话说,替换:
是不好的。self.current_user = user
@current_user = user
在"sign_in"方法?
我感谢任何帮助和建议。谢谢你。我对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已经成为会话的一部分,但还没有存储在数据库中,正确吗?
self.current_user = user
does not make 'current_user' a part of anything self
引用自身,SessionsHelper。self.current_user =
有效地调用它自己的方法,即setter方法def current_user=(user)
。
如果是这种情况,清单8.22中列出的方法是getter和Setter方法,对吧?
是的。
def current_user=(user) # Setter.
@current_user = user
end
第一个在DB中存储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])
根据浏览器的 memor_token cookie从数据库中检索并设置@current_user
为User
。
最后,需要getter和setter方法,因为在方法中公开实例变量(在本例中为"sign_in")是不好的做法?
在我看来,getter和setter方法并不是完全需要的。可以在整个帮助器中只使用@current_user
。
但是,设计(一个流行的用户身份验证gem)在其帮助程序中使用current_user
方法。这个评论也很相关。
换句话说,在"sign_in"方法中用
@current_user = user
替换self.current_user = user
是不好的?
用@current_user = user
替换它应该没有错。这个问题(与上面的链接评论相同)向您展示了教程的功能是相同的。