Ruby on rails 回调中的属性分配不起作用?

Ruby on rails 回调中的属性分配不起作用?,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我有HABTM型号客户端和书籍Clientmodel有一个bookshelf\u color属性,用于指示客户机是否拥有一整套书籍,其中一部分还是没有。一旦书架上的书发生变化,回调设置书架颜色应该反映变化 问题是,为什么我必须在下面的私有回调中为bookshelf_颜色分配加上前缀“self.”,才能使其正常工作(否则就不会发生这种情况) class客户端

我有HABTM型号
客户端
书籍
Client
model有一个bookshelf\u color属性,用于指示客户机是否拥有一整套书籍,其中一部分还是没有。一旦书架上的书发生变化,回调
设置书架颜色
应该反映变化

问题是,为什么我必须在下面的私有回调中为bookshelf_颜色分配加上前缀
“self.”
,才能使其正常工作(否则就不会发生这种情况)

class客户端
记住,您的模型属性只是幕后的实例变量–当我们与它们交互时,我们所做的只是调用由
attr\u accessor设置的getter和setter方法。当我们写
instance.bookshelf\u color=“red”
时,我们将把带有参数
“red”
的方法
bookshelf\u color=
发送给接收者
instance

酷。当我们只写
书架f\u color=“red”
时会发生什么

在Ruby中,裸字赋值用于定义局部变量。在方法定义中放入
name=“value”
将在本地范围中定义
name
,而不是在
self
上调用
name=
方法,即使该方法存在

class Foo
  attr_accessor :bar

  def set_bar(val)
    bar = val
  end
end

f = Foo.new
f.set_bar "baz"
f.bar # still nil
如果我指定了一个显式的接收者,
self.bar=val
,Ruby就会知道我想要发送
self
方法
bar=
,这会得到期望的结果


关于
self
的乐趣,以及你为什么要使用它,还有一些很好的进一步阅读。

谢谢,这就解释了它——一开始我觉得它很奇怪。
class Foo
  attr_accessor :bar

  def set_bar(val)
    bar = val
  end
end

f = Foo.new
f.set_bar "baz"
f.bar # still nil