在ruby中创建登录会话时了解“current_user”概念

我正在阅读伟大的Michael Hartl教程, 在这里构建ruby应用程序。

我试图理解如何创建会话的概念,我仍然坚持理解这一行:

self.current_user = user 

在这个方法中:

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

我理解使用user_token创建cookie的整个概念。

但是我不明白 self.current_user = user 什么 意思,为什么甚至需要保留这行代码 – 我有令牌的cookie – 为什么我需要知道当前用户?

此外,这个“自我”存储在哪里 – 它不像我在其中一个视图中看到的flash[:success]参数。 所以我不明白它在哪里。

在同一模块中也有这两种方法:

  def current_user=(user) @current_user = user end def current_user @current_user ||= User.find_by_remember_token(cookies[:remember_token]) end 

而且我仍在努力为这个神秘的current user连接目的点 – 它的目的是创建@current_user全局变量以在视图中使用吗?

如果是这样 – 为什么有这两个重复的函数def current_user=(user)def current_user

一些东西。

首先,你正在阅读错误的方法名称(考虑到隐藏的ruby方法命名方式,这并不奇怪)。 def current_user=(user)实际上被读取为定义带有参数user的方法current_user= ,而def current_user定义了一个不带参数的方法current_user 。 这些分别称为设定者吸气剂

这是一个参考: Ruby(编程语言):Ruby中的setter和getter是什么?

这就解释了重复。 关于你的下一个问题。

我不明白self.current_user = user是什么意思

self是一个自己的话题,值得自己讨论,所以我甚至不会尝试解释它(这里有许多参考文献 )。 出于这个问题的目的,重要的是要记住,为了设置实例变量,你需要为你的赋值添加前缀,即使在类中也是如此(出于其他目的,它将是隐含的)。 该行的其余部分是使用参数user调用上面提到的current_user= setter方法。

为什么甚至需要保留这行代码 – 我有令牌的cookie – 为什么我需要知道当前用户?

这是必要的原因是您不希望每次需要获取当前用户时都从令牌中查找用户。 看看getter方法:

 def current_user @current_user ||= User.find_by_remember_token(cookies[:remember_token]) end 

这说的是:如果我还没有查找并设置实例变量@current_user ,那么查找它; 如果我已经设置好了,那就回去吧。 这节省了大量的查找。

我认为这可以回答你的问题。 有很多更深层次的问题( self等),你可以在其他地方找到更多的信息。 这里有一个讨论为什么你需要在SO中将自己包含在set:中为什么Ruby setter需要“自我”。 课堂上的资格?

更新:小的澄清,关于在类中使用self作为setter的最后一个链接实际上有点偏离主题,因为你在模块中调用它而不是直接从类调用它。 在模块的上下文中, self.current_user = userself将成为模块包含在其中的类,例如User.current_user如果在类User调用它等)。再次,另一个讨论的话题本身…

def current_user=(user)方法基本上是sign_in方法用于设置current_user的setter。

def current_user将返回@current_user,如果未设置,它将通过remember_token在Users表中找到它。 这基本上允许您在任何时间点获取current_user。

在这种情况下,sign_in方法上下文中的self.current_user将引用调用类或模块。 它将从Session Helper模块调用current_user