Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 关于SessionHelper的混淆,特别是当前的用户方法?_Ruby On Rails_Ruby_Railstutorial.org - Fatal编程技术网

Ruby on rails 关于SessionHelper的混淆,特别是当前的用户方法?

Ruby on rails 关于SessionHelper的混淆,特别是当前的用户方法?,ruby-on-rails,ruby,railstutorial.org,Ruby On Rails,Ruby,Railstutorial.org,我正在从MichaelHartl的教程学习Rails,但我对SessionHelper模块感到困惑。没有提供足够的有关复制当前用户方法的信息。有人能解释一下为什么有两个,它们各自的目的是什么吗 module SessionsHelper def sign_in(user) cookies.permanent[:remember_token] = user.remember_token self.current_user = user end def current

我正在从MichaelHartl的教程学习Rails,但我对SessionHelper模块感到困惑。没有提供足够的有关复制
当前用户
方法的信息。有人能解释一下为什么有两个,它们各自的目的是什么吗

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\u in
方法会触发对
current\u user=(user)
的调用,但为什么要再次调用
current\u user
方法呢?我知道第二种方法是基于数据库中的
记住令牌
来获取用户,但我无法连接这些点。

当前用户
读取器
方法,
当前用户=
是属性
当前用户
编写器
方法。这两种方法是分开的,一种用于读取当前用户的值,另一种用于写入当前用户的值

编辑

在您的例子中,
current\u user=
方法意味着将实例变量
@current\u user
的值设置为传递的值(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
登录
方法

def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
end
sign\u-in
方法将从控制器调用为
sign\u-in-user

正如Aaron在评论中提到的,如果没有
self
,Ruby只需创建一个名为
current\u user
的局部变量,一旦
sign\u in
方法完成执行,该变量就会丢失

但是通过说,
self.current_user=user
当前_user的值将保留在类的当前实例(包含模块的控制器实例)中


为了更好地理解
self
请参考此

current\u user方法是否只返回从数据库中提取的@current\u用户变量?另外,你能解释一下sign_-in方法中的self方法是怎么做的吗?我认为self只在模型中用于引用从数据库中提取的记录。
self.
告诉ruby在类的实例上使用
current\u user=
方法,而不是创建一个名为
current\u user
的新局部变量,并将
user
分配给它,只是为了让它退出范围。@TazMan检查我的更新答案。看看它是否能消除你的疑虑。
def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
end