3

我目前正在审查会话,并且遇到了我以前使用的非常通用的会话控制器:

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),and指的是什么sign_outself这些被认为是类方法对吗?

4

1 回答 1

4
  1. current_user确实是一个在其中定义的方法SessionHelper,恰好返回对其内部实例变量的引用@current_user。这种方法通常被称为“阅读器”。因为返回的值是对 的引用@current_user,所以您可以使用该值,就好像它是实际的实例变量一样,因此current_user.name

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

于 2012-11-19T21:30:39.350 回答