Rails:current_user和会话澄清

时间:2012-11-19 21:18:21

标签: ruby-on-rails

我目前正在审核会话,但我遇到了一个我之前使用的非常通用的会话控制器:

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 %>
  1. 但是,我不明白为什么current_user可以访问,就像它是一个实例变量一样。这不是一种方法吗?为什么我可以像@current_user一样处理它,并从current_user.namecurrent_user.age等中提取属性?我认为这只适用于变量实例。

  2. 在第一和第二种方法sign_in(user)sign_out中,self指的是什么?这些被认为是类方法吗?

1 个答案:

答案 0 :(得分:4)

  1. current_user确实是SessionHelper中定义的方法,恰好会返回对其内部实例变量@current_user的引用。这种方法通常称为“读者”。因为返回的值是对@current_user的引用,所以您可以将该值用作实际的实例变量,因此current_user.name

  2. 在这两种方法的定义中使用self是必要的,因为没有它,ruby会假设您要在方法内部分配一个名为current_user的新局部变量而不是调用已在模块中定义的方法current_user=()。在这种情况下,self指的是模块本身。