新手问题 [Ruby on Rails Tutorial] 中的 sign_in 方法中的 current_user = user 为什么不是局部变量付值?

u1355214846 · 2013年03月18日 · 最后由 TREE 回复于 2013年07月05日 · 2884 次阅读
module SessionsHelper

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

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

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

  def current_user?(user)
    user == current_user
  end

  def sign_out
    current_user = nil
    cookies.delete(:remember_token)
  end
end

上面的 sign_in 方法中的 current_user = user 为什么不是局部变量付值?

写错了吧

current_user 调用的 current_user= 方法

#1 楼 @zgm 我又仔细看了下,真没写错

这应该和 ruby 的实现有关,想想对于这里 current_user = user 中的 current_user ruby 解释器拿到后他会怎么解释这个?把他当做一个 method 调用?还是初始化一个 局部变量?如果碰到的是 puts current_user ruby 解释器又会怎么解释?

也许现在你只需要记住 ruby 解释器会先寻找方法,然后再去找成员变量就够了。这也是为什么有很多人喜欢对在 ruby 中值进行 write 的时候喜欢加上 self 例如:

看来这里是我在看书的时候自己理解错了,多谢楼下更正。 Why isn't self always needed in ruby / rails / activerecord? 我错误的理解成 write 与 read 都会自动读取 self.method

@u1355214846 抱歉误导了

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

#4 楼 @wppurking 以前一直当 current_user = user 为局部变量付值的

#4 楼 @wppurking 难道 ruby 解释器先寻找方法,没有对应的方法然后再当做局部变量处理?

#6 楼 @u1355214846 我的意思是书写错了。肯定解释为 local_variable = something。相信自己的直觉。

事实上是写错了,在配套的视频里,这一章的最后 Michael 做了一个更正,最终的结果如下图:

@u1355214846 你的疑惑没有错,的确这里有问题,但恰好在这个例子里局部变量赋值也没有影响最终的效果,所以很容易让人摸不着头脑。

匿名 #10 2013年07月05日

我测试了一下,没有 current_user=(user) 方法,其他方法也不调用它的话,同样可以运行

需要 登录 后方可回复, 如果你还没有账号请 注册新账号