Ruby on rails 辅助方法实例变量

Ruby on rails helper method instance variable

提问人:Ari Ticas 提问时间:12/15/2021 最后编辑:razvansAri Ticas 更新时间:12/16/2021 访问量:161

问:

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

在下面的代码中,有人可以澄清一下方法中是否引用了实际方法并被读取为用户只是logged_in?如果方法死了,不返回 nil? current_userlogged_in?current_usercurrent_user

引用方法内部的实例变量current_user@current_usercurrent_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
Ruby-on-Rails 身份验证 方法

评论

0赞 engineersmnky 12/15/2021
前者是正确的。 means:方法的返回值不是 () 。logged_in?current_user!nil?
0赞 Ari Ticas 12/15/2021
感谢您的澄清,这确实有助于我了解正在发生的事情。干杯!

答:

1赞 max 12/15/2021 #1

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

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

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

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

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

在创建身份验证系统时,也应该只有一个知道如何获取用户的方法,所有其他代码都应该通过该系统,以便实现细节不会到处泄露。

评论

0赞 Ari Ticas 12/16/2021
感谢您的非常彻底和详细的解释。非常非常有帮助。非常感谢。谢谢!
0赞 engineersmnky 2/2/2022
从技术上讲,是虚假的,或者不是严格意义上的,因为理论上但是因此current_user.nil?session[:user_id]@current_user.nil?@current_user.nil?@current_user.nil? #=> falsesession[:user_id] #=> nilcurrent_user.nil? != @current_user.nil?
1赞 max 2/2/2022
@engineersmnky是的 - 你是对的。我忘记了表达式的返回值。if