【发布时间】:2009-05-02 10:10:46
【问题描述】:
我有一个相当独特的类,它允许其子类声明虚拟字段。子类可以通过调用父类的方法来声明存储为 XML 的虚拟字段,如下所示:
class Child1 < Parent
create_xml_field ["readings", "usage"]
end
我已经设法通过一个令人讨厌的工作来让它工作。 create_xml_field 方法将字段名称存储在 Class 变量中(见下文)。 init_xml_fields 方法是从 after_initialize 方法内部调用的。
class Parent < ActiveRecord::Base
def self.create_xml_field(fields)
@@xml_fields[self.name] = fields
end
def init_xml_fields(xml_fields)
xml_fields.each do |f|
f=f.to_sym
self.class_eval do
define_method(f) { ... } # define getter
define_method(f) { ... } # define setter
attr_accessible(f) # add to mass assign OK list, does not seem to work!
end
end
end
protected
def after_initialize
init_xml_fields
end
end
够恶心吧?我并不自豪,但我很难让它发挥作用。此外,该解决方法不适用于表单参数的批量分配。
有没有人有过动态调用 attr_acessible 以允许在子类中进行批量分配的经验?提前谢谢!
为清楚起见,对这篇文章进行了编辑!
【问题讨论】:
-
这一切都非常令人困惑,但在我看来,您正在调用实例方法来修改类,这将为该特定实例创建一个特征类。如果您在实际课程中发布了一个最小示例,这将有所帮助。您尝试做的事情非常简单,但您似乎从一个稍微错误的角度接近它。
-
同意,这令人困惑。对不起,我无法更好地解释它!也感谢您的回答,我将发布更多代码以更好地描述场景。
-
好吧,我一直在琢磨你的例子。很明显,我在方孔中有一些圆钉。以您的示例为起点,我如何声明将 add_yaml_fields :foo, :bar 声明放置在子类而不是父类中?另外,我的父母有多个孩子,那么 write_inheritable_array(:yaml_fields, ...) 声明会导致 Child1、Child2 等...之间出现问题吗?在此先感谢,是的,YAML 很可爱。
-
我已经更新了我的答案,让我知道是否可以解决问题。
标签: ruby-on-rails ruby metaprogramming