0

我是 Rails 新手,并且一直在阅读 Michael Hartl 的 Rails 教程。到目前为止,我已经能够理解教程中的所有内容,但现在我想我在第 8 章的中途被困住了。我希望更有经验的 Rails 程序员确认我正确地遵循了作者的解释. 我说的是下面的第 8 章第 8.2.3 节

在第 8.2.3 节中,“sign_in”方法有一行:

self.current_user = user

因此,通过使用“self”而不是“current_user”,current_user 已成为 Session 的一部分,但尚未存储在数据库中,对吗?

如果是这样的话,清单 8.22中列出的方法是 getter 和 setter 方法,对吗?第一个将 current_user 存储在数据库中,第二个根据需要检索它?

最后,需要 getter 和 setter 方法,因为在方法中公开实例变量(在本例中为“sign_in”)是一种不好的做法?换句话说,替换是不好的:

self.current_user = user

@current_user = user

在“sign_in”方法中?

我感谢任何帮助和建议。谢谢你。

4

1 回答 1

-1

我对 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_useruser


  def current_user # Getter.
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

第二个根据需要检索它?

第二种方法,current_user,返回一个现有 @current_user值。
如果@current_usernil(空),它运行

||= 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 = userwith会很糟糕?@current_user = user

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

于 2013-05-09T15:57:41.573 回答