2013-05-07 161 views
0

我是Rails的新手,并且一直在经历Michael Hartl的Rails教程。直到目前为止,我已经能够理解教程中的所有内容,但现在我认为我在第8章的中途停滞不前。我想从更有经验的Rails程序员那里得到一些确认,我正确地遵循作者的解释。我说的是具体低于约Chapter 8, Section 8.2.3Ruby on Rails教程Michael Hartl,第8章,“当前用户”部分

在第8.2.3节中,“sign_in”方法有行:通过使用,而不是仅仅“CURRENT_USER”,“自我”

self.current_user = user 

因此,CURRENT_USER有已经成为Session的一部分,但尚未存储在数据库中,对吗?

如果是这样,Listing 8.22中列出的方法是getter和setter方法,是否正确?第一个将current_user存储在数据库中,第二个根据需要检索它?

最后,getter和setter方法是需要的,因为它不良的做法暴露方法中的实例变量(在本例中为“sign_in”)?换句话说,这将是坏的替换:

self.current_user = user 

@current_user = user 

在 “sign_in” 的方法?

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

回答

-1

我不是很精通Rails,但这里是我的外行对SessionsHelper中方法的理解。

首先,@current_user是模块SessionsHelper的实例变量。这意味着它持续用于SessionsHelper中方法的后续调用。


def sign_in(user) 
    cookies.permanent[:remember_token] = user.remember_token 
    self.current_user = user 
    end 

因此,通过使用“自我”,而不仅仅是“CURRENT_USER”,CURRENT_USER已经取得的会话的一部分,但尚未存储在数据库中,是否正确?

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_usernil(空),它运行

||= User.find_by_remember_token(cookies[:remember_token]) 

来检索和设置@current_userUser基于浏览器的remember_token的cookie数据库。


最后,需要getter和setter方法,因为它不好的做法,暴露出的方法的实例变量(在这种情况下,“sign_in”)?

在我看来,getter和setter方法并不是完全需要的。可以在整个帮手中使用@current_user
但是,Devise (a popular user authentication gem)在其助手中使用current_user方法。这个comment也是相关的。


换句话说,这将是坏的替换:self.current_user = user@current_user = user在 “sign_in” 的方法?

@current_user = user替换它应该没有问题。这个question(与上面链接注释相同的链接)显示了本教程中的功能相同。

相关问题