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
@current_user ||= User.find_by(id: session[:user_id])
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
end
目前正在编写第8章的Hartl的Rails教程,他可以让您为用户编写代码以便登录并保持登录状态。
在方法logged_in?下,为什么使用局部变量current_user
代替@current_user
?
答案 0 :(得分:1)
current_user
不是局部变量,它是一种实例方法。
为什么不使用实例变量?
正在使用。
当您调用current_user
方法时,它会返回一个实例变量@current_user
,该变量恰好是User对象或nil
。
答案 1 :(得分:1)
那不是局部变量!他正在调用current_user方法,该方法返回@current_user值,所以链条为零。您需要查看ruby中的范围,以了解方法和实例变量以及局部变量如何相互作用!
答案 2 :(得分:1)
因为current_user - 是在同一模块中定义的方法。这种技术称为memoization。你可以在这里阅读http://www.justinweiss.com/articles/4-simple-memoization-patterns-in-ruby-and-one-gem/。