我正在从Michael Hartl的教程中学习Rails,但我对SessionsHelper模块感到困惑。没有提供有关current_user
方法重复的足够信息。有人可以解释为什么有两个,他们的个人目的是什么?
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
end
我了解sign_in
方法会触发对current_user=(user)
的调用,但为什么再次调用current_user
方法?我理解第二种方法从数据库中获取基于remember_token
的用户,但我无法连接这些点。
答案 0 :(得分:2)
current_user
是reader
方法,current_user=
是您的属性writer
的{{1}}方法。这两个是单独的方法,一个用于读取值,另一个用于写入current_user的值。
修改强>
在您的情况下,current_user
方法意味着将实例变量current_user=
的值设置为等于传递的值(用户)。
@current_user
def current_user=(user)
@current_user = user
end
方法意味着,
current_user
def current_user
## if @current_user = nil then
## set @current_user = User.find_by_remember_token(cookies[:remember_token])
## else return @current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
方法,
sign_in
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
方法将从控制器调用为sign_in
。
就像Aaron在评论中提到的那样,没有sign_in user
,Ruby只会创建一个名为self
的局部变量,一旦current_user
方法完成执行就会丢失。
但是,通过说sign_in
,current_user的值将保留在类的当前实例(包含模块的控制器实例)中。
为了更好地理解self.current_user = user
,请参阅此Stackoverflow question on self