关于SessionsHelper的混淆,特别是current_user方法?

时间:2014-02-28 03:01:12

标签: ruby-on-rails ruby railstutorial.org

我正在从Michael Hartl的教程中学习Rails,但我对SessionsHelper模块感到困惑。没有提供有关current_user方法重复的足够信息。有人可以解释为什么有两个,他们的个人目的是什么?

module SessionsHelper

  def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

end

我了解sign_in方法会触发对current_user=(user)的调用,但为什么再次调用current_user方法?我理解第二种方法从数据库中获取基于remember_token的用户,但我无法连接这些点。

1 个答案:

答案 0 :(得分:2)

current_userreader方法,current_user=是您的属性writer的{​​{1}}方法。这两个是单独的方法,一个用于读取值,另一个用于写入current_user的值。

修改

在您的情况下,current_user方法意味着将实例变量current_user=的值设置为等于传递的值(用户)。

@current_user

def current_user=(user) @current_user = user end 方法意味着,

current_user

def current_user ## if @current_user = nil then ## set @current_user = User.find_by_remember_token(cookies[:remember_token]) ## else return @current_user @current_user ||= User.find_by_remember_token(cookies[:remember_token]) end 方法,

sign_in

def sign_in(user) cookies.permanent[:remember_token] = user.remember_token self.current_user = user end 方法将从控制器调用为sign_in

就像Aaron在评论中提到的那样,没有sign_in user,Ruby只会创建一个名为self的局部变量,一旦current_user方法完成执行就会丢失。

但是,通过说sign_in,current_user的值将保留在类的当前实例(包含模块的控制器实例)中。

为了更好地理解self.current_user = user,请参阅此Stackoverflow question on self