Ruby Hart的Ruby on Rails教程,第8章,“当前用户”部分

时间:2013-05-07 22:20:53

标签: railstutorial.org

我是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”方法中的

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

1 个答案:

答案 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_userUser


  

最后,需要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(与上面链接的评论相同的链接)向您展示了本教程中的功能相同。