我目前正在审核会话,但我遇到了一个我之前使用的非常通用的会话控制器:
module SessionsHelper
def sign_in(user)
self.current_user = user
cookies[:remember_token] = user.remember_token
end
def sign_out
self.current_user = nil
cookies[:remember_token] = nil
end
def signed_in?
!current_user.nil?
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
def current_user=(user)
@current_user = user
end
end
我意识到我在视图中多次使用current_user。例如:
<% if current_user == @user %>
<%= current_user.name %>
<% else %>
This user is not you.
<% end %>
但是,我不明白为什么current_user
可以访问,就像它是一个实例变量一样。这不是一种方法吗?为什么我可以像@current_user
一样处理它,并从current_user.name
,current_user.age
等中提取属性?我认为这只适用于变量实例。
在第一和第二种方法sign_in(user)
和sign_out
中,self
指的是什么?这些被认为是类方法吗?
答案 0 :(得分:4)
current_user
确实是SessionHelper
中定义的方法,恰好会返回对其内部实例变量@current_user
的引用。这种方法通常称为“读者”。因为返回的值是对@current_user
的引用,所以您可以将该值用作实际的实例变量,因此current_user.name
在这两种方法的定义中使用self
是必要的,因为没有它,ruby会假设您要在方法内部分配一个名为current_user
的新局部变量而不是调用已在模块中定义的方法current_user=()
。在这种情况下,self
指的是模块本身。