Ruby on rails 辅助方法实例变量

Posted

技术标签:

【中文标题】Ruby on rails 辅助方法实例变量【英文标题】:Ruby on rails helper method instance variable 【发布时间】:2022-01-18 03:30:57 【问题描述】:

我正在关注 Michael Hartl 的 rails 教程。我对会话助手模块的一部分感到困惑。

在下面的代码中,有人可以澄清logged_in? 方法中的 current_user 是否指的是实际方法current_user 并且被读取为用户仅登录?如果方法current_user 死了不返回nil?

current_user 是指current_user 方法内部的实例变量@current_user

非常感谢任何澄清。非常感谢!

module SessionsHelper
  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Returns the current logged-in user (if any).
  def current_user
    if session[:user_id]
      @current_user ||= User.find_by(id: session[:user_id]) 
    end
  end

  # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end 
end

【问题讨论】:

前者是正确的。 logged_in? 表示:current_user 方法的返回值不是(!nil? 感谢您的澄清,真正帮助我了解发生了什么。干杯! 【参考方案1】:

您放入app/helpers 目录的每个模块都包含在您的控制器中。当你包含一个模块时,你将它添加到类的祖先链中,这样它的行为就好像该方法是在类本身中定义的一样。

所以要逐行解释current_user 方法,它会检查会话是否具有键:user_id,然后将实例变量@current_user 分配给控制器(如果尚未设置)。这被称为记忆 getter 方法 - 并避免在每次调用时触发数据库查询来获取用户。

logged_id? 中,您正在使用该 getter 方法:

# Returns true if the user is logged in, false otherwise.
def logged_in?
  !current_user.nil?
end 

实际上可以写成!@current_user.nil?。但是有一个很大的警告 - 在 Ruby 中,您可以引用未设置且没有错误的实例变量。因此,如果您打错字并写了!@curent_user.nil?,它就会意外失败,因为它总是为零。

在创建身份验证系统时,还应该只有一种方法知道如何获取用户,并且所有其他代码都应该通过该系统,这样实现细节就不会到处泄露。

【讨论】:

感谢您非常彻底和详细的解释。非常非常有帮助。非常感激。谢谢!

以上是关于Ruby on rails 辅助方法实例变量的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby on Rails 中测试模型实例是不是为“空”的最佳方法是啥?

ruby on rails 在关联调用中使用变量

CKEditor的第二个实例没有保存到db | Ruby on Rails

如何从 Ruby on Rails 中的字符串值创建变量名?

Ruby on Rails 使用视图助手中的变量在视图中动态生成字段名称

将Ruby on Rails项目从github上传到AWS EC2实例错误