2011-03-21 72 views
0

我目前通过http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec:current_use r] 1工作,我很难理解两个current_user方法之间的区别。在我的另一个方法sign_in中有一个调用self.current_user但我无法理解哪个current_user被调用,以及其他current_user方法实际上在做什么。帮助红宝石的方法同名

module SessionsHelper 
    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 signed_in? 
    !current_user.nil? 
    end 

    private 
    def user_from_remember_token 
     # using the * makes us pass two values [id,salt] 
     User.authenticate_with_salt(*remember_token) 
    end 

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

回答

1

当您分配给对象的属性CURRENT_USER的current_user=方法被调用,当你这样做不是current_user方法被调用。

所以self.current_user = user调用current_user=!current_user.nil?调用current_user

+0

如果我只是调用''current_user.nil?'',我甚至会需要'current_user ='方法吗?因为'current_user'方法没有检索用户,或者只是将'@ current_user'设置为零。 – Kevin 2011-03-21 04:56:42

+0

@Kevin:如果将sign_in修改为分配给@current_user,那么您可以在该代码中删除current_user =方法。但是如果你想创建“模仿”用户的能力,你会发现current_user =很有用 - 你是以你身份登录的,但假装是别人。 (此功能可以帮助调试客户支持问题。) – btilly 2011-03-21 05:17:24

0

区别在于current_user=实现了相等的运算符。所以当你做current_user = something时,它真的叫current_user=(something)

而不是current_user,这只是一个'吸气'。

我在Ruby访问器上阅读this article

0

这是分配方法。

使用像以下的方法

obj.current_user= some_user_object呼叫。

def current_user=(user) 
    @current_user = user 
    end 

以下方法返回对象当前用户。如果@current_user为空,它将分配用户对象并返回它。

some_user=obj.current_user调用以下方法。

def current_user 
    @current_user ||= user_from_remember_token 
    end