我经历了很大的迈克尔·哈特尔教程构建红宝石应用在这里 。
我想了解如何创建一个会话的概念,我被困在了解这一行:
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]
参数,我可以在我的观点一见。 所以我不知道它在哪里。
也有这2种方法在同一模块中:
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
全局变量视图中的使用?
如果是这样的-为什么有有这些2个复制功能def current_user=(user)
和def current_user
一些东西。
首先,你正在阅读的方法名称错误(因为神秘的红宝石方法命名如何能这并不奇怪)。 def current_user=(user)
实际被读取作为定义方法current_user=
在一个需要参数user
,而def current_user
限定的方法current_user
不带参数。 这些分别被称为setter和getter。
这里是一个参考: 红宝石(编程语言):什么是getter和setter方法在Ruby中?
这样解释了重复。 在你的下一个问题。
我不明白什么呢self.current_user =用户的手段
self
本身就是一个话题,对得起自己的讨论,所以我甚至不会试图解释它(这里有一个参考了许多的)。 对于这个问题的目的是要记住,为了设置实例变量,你需要前缀你的任务只是重要的self
,甚至是类(如作其他用途这将是隐含的)之内。 该行的其余部分是将一个呼叫current_user=
我如上所述,用参数设定器方法user
。
为什么它甚至有必要保留此行的代码 - 我与令牌的Cookie - 为什么我需要知道当前用户?
这是必要的原因是,你不想被从令牌每次你需要获得当前用户的时间查找用户。 看看getter方法:
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
它说的是:如果我没有抬头,并设置实例变量@current_user
然而,再看看它; 如果我已经弄好了,然后就返回。 这节省了大量的仰视。
我认为,回答你的问题。 有很多的更深层次的问题( self
等),你可以找到其他地方的更多信息。 这就是为什么你需要包括一个讨论self
在SO制定者: 为什么红宝石制定者需要“自我”。 在类中的资格?
UPDATE:小的澄清,有关使用最后一个环节self
为班级内制定者其实是有点离题,因为你在一个模块内从一个类调用它,而不是直接。 在一个模块中,上下文self
于self.current_user = user
将成为类,该模块包括内部,例如User.current_user
如果它是在类中称为User
,等等。同样,对本身的讨论另一个话题...
该方法def current_user=(user)
基本上是该sign_in方法使用,以设定CURRENT_USER一个setter。
def current_user
将返回@current_user或者如果没有设置它,它会发现它在由remember_token用户表。 这基本上可以让你在任何时间点获得CURRENT_USER。
self.current_user
在sign_in方法的上下文将是指到调用类或模块在这种情况下。 这将调用current_user
从Session Helper
模块。