Ruby on rails 回调中的属性分配不起作用?
我有HABTM型号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客户端
客户端
和书籍
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