Ruby on Rails Tutorial by Michael Hartl, Chapter 8, "Current User"



我是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_userUser


最后,需要getter和setter方法,因为在方法中公开实例变量(在本例中为"sign_in")是不好的做法?

在我看来,getter和setter方法并不是完全需要的。可以在整个帮助器中只使用@current_user
但是,设计(一个流行的用户身份验证gem)在其帮助程序中使用current_user方法。这个评论也很相关。


换句话说,在"sign_in"方法中用@current_user = user替换self.current_user = user是不好的?

@current_user = user替换它应该没有错。这个问题(与上面的链接评论相同)向您展示了教程的功能是相同的。

相关内容

最新更新