我是铁轨新手上的红宝石。下面是用户登录后记住会话的代码登录的一部分。我从ruby on rails教程获得此代码并尝试学习。在sign_in方法中我们定义
self.current_user=user
之后我们有两种不同的current_user方法。如果我删除第一个,则会显示错误消息。
如果我们使用像self.current_user=user?
为什么有必要这样做?我不明白为什么我们再次定义另一个current_user方法。我们只是把它放到第一个?请看下面。非常感谢。
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
self.current_user = user
end
def current_user=(user)
@current_user=user
end
def current_user
@current_user ||= user_from_remember_token
end
完整代码:
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
self.current_user = user
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= user_from_remember_token
end
private
def user_from_remember_token
User.authenticate_with_salt(*remember_token)
end
def remember_token
cookies.signed[:remember_token] || [nil, nil]
end
答案 0 :(得分:2)
为current_user
定义的方法是setter / getter方法。
#setter
def current_user=(user)
@current_user=user
end
#getter
def current_user
@current_user ||= user_from_remember_token
end
请注意,对于setter方法,名称以=
符号结尾。
在sign_in
方法中执行self.curcrent_user = user
实际调用setter时,不会访问实例变量current_user
。访问它将是@current_user=user
。这就是删除它时收到错误的原因。
通常你需要setter / getters才能从课堂外设置和获取东西。例如,如果您希望稍后检索当前用户,则可以在类的实例上调用current_user
。
虽然我必须承认,在这种情况下,我没有太多意义建立公共二传手。通常您需要sign_in
和sign_off
方法,而不是明确的current_user=
。
答案 1 :(得分:1)
两个current_user方法实际上是两种不同的方法,一种用于设置current_user变量,另一种用于再次获取它,实际上使用的是一种称为memoization的模式(更多内容见下文)。
current_user=(user)
方法设置一个实例变量(以@开头的ruby变量中的各种级别的变量范围都是一个实例 - 有关更多信息,请参阅this page)。 def current_user
然后返回相同变量的内容*。
*除非未设置@current_user变量。这是@current_user ||= user_from_remember_token
行的目的。这有效地说是'返回@current_user变量的内容,除非它没有被设置,在这种情况下返回运行方法user_from_remember_token
的结果以及设置@current_user变量同样的'。这是一种称为memoization的技术(阅读here为什么这是一件好事)