Ruby on rails 辅助方法实例变量
Ruby on rails helper method instance variable
我正在关注 Michael Hartl 的 rails 教程。我对会话帮助程序模块的一部分感到困惑。
在下面的代码中,有人可以澄清 logged_in?
方法中的 current_user
是否指的是实际方法 current_user
并且因为用户只是 logged_in?如果方法 current_user
不死 return 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
您放在 app/helpers
目录中的每个模块都包含在您的控制器中。当您包含一个模块时,您将它添加到 class 的祖先链中,因此它的行为就好像该方法是在 class 本身中定义的一样。
因此,为了逐行解释 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?
,它就会意外失败,因为它始终为 nil。
创建身份验证系统时,也应该只有一种方法知道如何获取用户,所有其他代码都应该通过该系统,这样实现细节就不会到处泄露。
我正在关注 Michael Hartl 的 rails 教程。我对会话帮助程序模块的一部分感到困惑。
在下面的代码中,有人可以澄清 logged_in?
方法中的 current_user
是否指的是实际方法 current_user
并且因为用户只是 logged_in?如果方法 current_user
不死 return 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
您放在 app/helpers
目录中的每个模块都包含在您的控制器中。当您包含一个模块时,您将它添加到 class 的祖先链中,因此它的行为就好像该方法是在 class 本身中定义的一样。
因此,为了逐行解释 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?
,它就会意外失败,因为它始终为 nil。
创建身份验证系统时,也应该只有一种方法知道如何获取用户,所有其他代码都应该通过该系统,这样实现细节就不会到处泄露。