Alo*_*lon 4 ruby session ruby-on-rails session-variables session-cookies
我正在阅读伟大的Michael Hartl教程,在这里构建ruby应用程序.
我试图理解如何创建会话的概念,我坚持理解这一行:
self.current_user = user
Run Code Online (Sandbox Code Playgroud)
在这个方法中:
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
end
Run Code Online (Sandbox Code Playgroud)
我理解使用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
Run Code Online (Sandbox Code Playgroud)
而且我仍然试图将这个神秘的目的点连接起来current user- 它的目的是创建@current_user在视图中使用的全局变量吗?
如果是这样 - 为什么有这两个重复的功能def current_user=(user)和def current_user
一些东西.
首先,你正在阅读方法名称错误(考虑到隐藏的ruby方法命名可能会出现这种情况并不奇怪).def current_user=(user)实际上读作定义current_user=采用参数的方法user,而def current_user定义一个current_user不带参数的方法.这些分别称为设定者和吸气剂.
这是一个参考:Ruby(编程语言):Ruby中的setter和getter是什么?
这就解释了重复.关于你的下一个问题.
我不明白self.current_user = user是什么意思
self是一个自己的话题,值得自己讨论,所以我甚至不会尝试解释它(这里有许多参考文献).出于这个问题的目的,重要的是要记住,为了设置实例变量,你需要为你的赋值添加前缀self,甚至在类中(为了其他目的,它将是隐含的).该行的其余部分是使用参数调用current_user=上面提到的setter方法user.
为什么甚至需要保留这行代码 - 我有令牌的cookie - 为什么我需要知道当前用户?
这是必要的原因是您不希望每次需要获取当前用户时都从令牌中查找用户.看看getter方法:
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
Run Code Online (Sandbox Code Playgroud)
这说的是:如果我还没有查找并设置实例变量@current_user,那么查找它; 如果我已经设置好了,那就回去吧.这节省了大量的查找.
我认为这可以回答你的问题.有很多更深层次的问题(self等等),您可以在其他地方找到更多信息.这里有一个关于为什么需要self在SO中包含setter的讨论:为什么Ruby setter需要"自我".课程内的资格?
更新:小的澄清,关于self在类中使用setter的最后一个链接实际上有点偏离主题,因为你在模块中调用它而不是直接从类调用它.在模块的上下文中,selfin self.current_user = user将成为模块包含在其中的类,例如,User.current_user如果它在类中被调用User,等等.再次,另一个讨论的话题本身......