【问题标题】:Confusion about SessionsHelper, specifically the current_user method?对 SessionsHelper 感到困惑,特别是 current_user 方法?
【发布时间】:2014-02-28 12:53:13
【问题描述】:

我正在从 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 从数据库中获取用户,但我无法将这些点联系起来。

【问题讨论】:

    标签: ruby-on-rails ruby railstutorial.org


    【解决方案1】:

    current_userreader 方法,current_user= 是您的属性 current_userwriter 方法。这两个是独立的方法,一个用于读取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 方法将从控制器调用为sign_in user

    就像评论中提到的 Aaron 一样,如果没有 self,Ruby 只会创建一个名为 current_user 的局部变量,一旦 sign_in 方法完成执行,该变量就会丢失。

    但话说回来,self.current_user = user current_user 的值将保留在类的当前实例(包含模块的控制器实例)中。

    要更好地了解self,请参阅此Stackoverflow question on self

    【讨论】:

    • 那么 current_user 方法只返回从数据库中提取的@current_user 变量?您还可以解释一下在 sign_in 方法中的 self 方法是什么吗?我认为 self 仅在模型中用于引用从数据库中提取的记录。
    • self. 告诉 ruby​​ 在类的实例上使用 current_user= 方法,而不是创建一个名为 current_user 的新局部变量并将 user 分配给它只是为了它超出了范围。
    • @TazMan 检查我更新的答案。看看它是否能消除你的疑虑。
    猜你喜欢
    • 2013-07-27
    • 2017-03-20
    • 2013-07-19
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多