2011-06-01 49 views
0

我是一个在rails新手上的红宝石。下面是用户登录后记录会话的代码登录的一部分。我从ruby on rails教程中获得了此代码,并试图学习。在这里我们定义了sign_in方法self.method方法内调用

self.current_user=user 

之后我们有两种不同的current_user方法。如果我删除第一个,它会给出错误消息。

为什么我们需要定义方法,如(DEF CURRENT_USER =),如果我们使用像self.current_user=user?

表达为什么要这么做呢?我不明白为什么我们再次定义另一个current_user方法。不能,我们只是把它放在第一个?请看下面。非常感谢。

def sign_in(user) 
    cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
    self.current_user = user 
end 
def current_user=(user) 
    @current_user=user 
end 
def current_user 
    @current_user ||= user_from_remember_token 
end 

全码:

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

def current_user=(user) 
    @current_user = user 
end 
def current_user 
    @current_user ||= user_from_remember_token 
end 

private 

def user_from_remember_token 
    User.authenticate_with_salt(*remember_token) 
end 

def remember_token 
    cookies.signed[:remember_token] || [nil, nil] 
end 

回答

1

两个CURRENT_USER方法实际上是两种不同的方法,一个用于设定CURRENT_USER变量,而另一个用于重新得到它,这实际上是使用称为memoization的图案(更多在下面)。

current_user=(user)方法设置一个实例变量(ruby变量中以@开头的变量作用域的各个级别的作用域为一个实例 - 有关更多信息,请参阅this page)。然后def current_user返回相同变量*的内容。

*除非未设置@current_user变量。这是@current_user ||= user_from_remember_token系列的用途。这实际上是说'返回@current_user变量的内容,除非它没有被设置,在这种情况下,返回运行方法user_from_remember_token的结果,并且也会将@current_user变量设置为相同'。这是一种称为memoization的技术(读取here为什么这是件好事)

2

current_user定义的方法是setter/getter方法。

#setter 
def current_user=(user) 
    @current_user=user 
end 

#getter 
def current_user 
    @current_user ||= user_from_remember_token 
end 

请注意,对于setter方法,名称以=符号结尾。

sign_in方法当你做self.curcrent_user = user你实际上调用setter,你不访问实例变量current_user。访问它将是@current_user=user。这就是为什么如果删除它会收到错误的原因。

通常你需要setter/getters以便能够设置和从课外获取内容。例如,如果您希望稍后检索当前用户,则可以在班级实例上调用current_user

虽然我必须承认,在这种情况下,我没有看到在公共设置中有太多意义。通常您需要sign_insign_off方法,而不是明确的current_user=

+0

很好的解释。一旦你提到'setter'和'getters',整个事情才有意义。 – Ghazaly 2012-06-29 09:17:36