Ruby on rails rails在类内有许多访问权限
我有一个rails模型课Ruby on rails rails在类内有许多访问权限,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个rails模型课 class Model < ActiveRecord::Base has_many :object_collection def add_object(object) object_collection.push object // works @object_collection.push object // does not work self.object_collection.push object //
class Model < ActiveRecord::Base
has_many :object_collection
def add_object(object)
object_collection.push object // works
@object_collection.push object // does not work
self.object_collection.push object // works
end
end
类模型
我想知道是否有人能向我解释为什么@还不能工作我认为这两个意思是一样的吗
干杯它们不一样。考虑下面的红宝石代码:
class Person
attr_accessor :employer
end
john = Person.new
john.employer = "ACME"
john.employer # equals "ACME"
方法attr\u accessor
方便地为您生成属性读写器(employer=
和employer
)。您可以使用这些方法读取和写入存储在实例变量@employer
中的属性
现在,我们可以将上述内容重写为以下内容,其功能与上述代码相同:
class Person
def employer=(new_employer)
@works_for = new_employer
end
def employer
@works_for
end
end
john = Person.new
john.employer = "ACME"
john.employer # equals "ACME"
现在,不再使用实例变量@employer
。我们选择手动编写访问器,并且可以自由地为实例变量选择不同的名称。在此特定示例中,实例变量的名称与属性访问器的名称不同。没有什么能阻止你那样做
这类似于ActiveRecord
在内部存储其属性的方式。它们不存储在同名的实例变量中,这就是为什么对@object\u集合的push
调用不起作用的原因
正如您所理解的,属性读取器和编写器提供了某种抽象,可以对您隐藏实现细节。因此,直接在子类中读取和写入实例变量通常被认为是不好的做法。@foo标识了一个名为@foo的实例变量。foo识别了一个名为foo的方法。
默认情况下,Ruby中的实例变量是私有的。这意味着您不能访问实例变量的值,除非您有公开该值的公共方法
这些方法称为setter和getter。按照惯例,setter和getter具有相同的实例变量名称,但这不是必需的
class MyClass
def initialize
@foo
end
def foo=(value)
@foo = foo
end
def foo
@foo
end
def an_other_foo=(value)
@foo = foo
end
def an_other_foo
@foo
end
end
虽然方法和实例变量可以有相似的名称,但它们有不同的元素。
如果您不清楚这个主题,您可能需要停止使用Rails,重新学习Ruby的工作原理
在您的特定情况下,object_集合不作为实例变量存在,因为它是一种关联方法。它们的含义不同。一个是实例变量,另一个是方法
@foo表示“实例变量foo的值”,其中as self.foo表示“对我自己调用方法foo的值”
对于方法foo=来说,设置@foo实例变量是很典型的,这样我就可以看出对这种语言不熟悉的人可能会感到困惑。我鼓励你读一本关于ruby语言的书。有一个专门为那些做过一些rails但从未学过ruby的人设计的。您通常可以在不理解语言或这些语句的含义的情况下攻击rails,但与花少量时间学习ruby语言本身的人相比,您的效率要低得多
作为一般规则,尽可能使用self.foo表单,因为它对类定义的更改不太敏感。所有好的答案都会让大家高兴,