一些东西。
首先,您读错了方法名称(考虑到 ruby 方法命名的神秘性,这并不奇怪)。def current_user=(user)
实际上被理解为定义方法current_user=
这需要一个论点user
, 然而def current_user
定义一个方法current_user
这不需要争论。这些分别称为setters and getters.
这是一个参考:Ruby(编程语言):Ruby 中的 setter 和 getter 是什么? http://www.quora.com/Ruby-programming-language/What-are-setters-and-getters-in-Ruby
这就解释了重复的情况。继续你的下一个问题。
我不明白 self.current_user = user 是什么意思
self
本身就是一个话题,值得单独讨论,所以我什至不会尝试解释它(这里是一份参考 http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/从许多中)。出于这个问题的目的,重要的是要记住,为了设置实例变量,您需要在赋值前加上前缀self
,即使在类中(出于其他目的它会是隐式的)。该行的其余部分是对current_user=
我上面提到的 setter 方法,带有参数user
.
为什么有必要保留这行代码 - 我有带有令牌的 cookie - 为什么我需要知道当前用户?
之所以有必要,是因为您不想每次需要获取当前用户时都从令牌中查找用户。看一下getter方法:
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
这说明的是:如果我没有查找并设置实例变量@current_user
然而,然后查一下;如果我已经设置了,那么就返回它。这样就省去了很多查找的麻烦。
我认为这回答了你的问题。还有很多更深层次的问题(self
等),您可以在其他地方找到更多信息。这是关于为什么需要包含的一个讨论self
在 SO 的设置器中:为什么 Ruby setter 需要“自我”。班级内的资格? https://stackoverflow.com/questions/44715/why-do-ruby-setters-need-self-qualification-within-the-class
更新:小澄清,关于使用的最后一个链接self
for class 中的 setter 实际上有点偏离主题,因为您是在模块中调用它,而不是直接从类中调用它。在模块的上下文中,self
in self.current_user = user
将成为该模块包含在其中的类,例如User.current_user
如果在类内调用User
等等。这又是另一个讨论话题......