我有一个 Rails 5 类,其中包括 ActiveAttr::Model、ActiveAttr:MassAssignment 和 ActiveAttr::AttributeDefaults。
它使用该方法定义了几个属性attribute
并具有一些实例方法。我在操作定义的属性时遇到了一些麻烦。我的问题是如何在初始化程序中设置属性值。一些代码:
class CompanyPresenter
include ActiveAttr::Model
include ActiveAttr::MassAssignment
include ActiveAttr::AttributeDefaults
attribute :identifier
# ...
attribute :street_address
attribute :postal_code
attribute :city
attribute :country
# ...
attribute :logo
attribute :schema_org_identifier
attribute :productontology
attribute :website
def initialize(attributes = nil, options = {})
super
fetch_po_field
end
def fetch_po_field
productontology = g_i_f_n('ontology') if identifier
end
def uri
@uri ||= URI.parse(website)
end
# ...
end
正如我写的那样,该方法fetch_po_field
不起作用,它认为 productontology 是一个局部变量(g_i_f_n(...)
定义得更远,它起作用并且它的返回值是正确的)。我发现设置此变量的唯一方法是改为编写self.productontology
。此外,实例变量@uri
没有定义为属性,而是仅在此位置记录并从外部可见。
可能我只是忘记了 Ruby 和 Rails 的基础知识,我已经用 ActiveRecord 和 ActiveModel 做了这么久。任何人都可以解释为什么我需要 write self.productontology
, using@productontology
不起作用,以及为什么我编写原始代码的前任将 @ 表示法@uri
与属性声明样式混合在一起?我想他一定有什么理由这样做。
我也对任何指向文档的指针感到满意。我无法找到 ActiveAttr 的文档,显示在 ActiveAttr 类的方法中对实例变量的操作。
谢谢 :-)