【发布时间】:2015-06-03 13:17:28
【问题描述】:
我在 Rails 教程的8.4.3 - Forgetting Users 部分。
# app/helpers/session_helper.rb
module SessionsHelper
...
# Returns the user corresponding to the remember token cookie.
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
# Logs out the current user
def log_out
forget(current_user)
session.delete(:user_id)
@current_user = nil
end
...
end
在current_user 方法中,我们将用户分配给@current_user 实例变量。我不明白为什么我们不在log_out 方法中使用相同的实例变量(在该方法current_user 前面没有@ 符号)。 current_user 是从哪里来的,因为它没有作为参数传递给该方法?
【问题讨论】:
-
current_user 是一个辅助方法github.com/plataformatec/devise#controller-filters-and-helpers
-
forget(current_user)它正在调用助手current_user。 Ruby 方法默认返回最后执行的行。所以current_userhelper 将返回@current_user对象如果用户logged_id。 -
这里要注意的另一个重要事项是,在您调用
current_user方法之前,不会设置@current_user。因此,在log_out方法的范围内,您必须假设@current_user不存在,直到您运行创建它的方法,即current_user。
标签: ruby-on-rails railstutorial.org