在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 = user
的self
将成为模块包含在其中的类,例如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
。