У меня есть довольно уникальный класс, который позволяет его дочерним классам объявлять виртуальные поля. Ребенок может объявить виртуальные поля хранятся в виде XML с помощью вызова метода родительского класса, как это:Как вы называете attr_accessible динамически в Rails?
class Child1 < Parent
create_xml_field ["readings", "usage"]
end
мне удалось получить его работу через неприятную работу вокруг. Метод create_xml_field сохраняет имена полей в переменной класса (см. Ниже). Метод 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 динамически, чтобы разрешить массовое присвоение в дочернем классе? Заранее спасибо!
Это сообщение было отредактировано для четкости!
Это все очень запутанно, но мне кажется, что вы вызываете метод экземпляра для изменения класса, который создавал бы eigenclass для этого конкретного экземпляра. Это поможет, если вы разместите минимальный пример с вашими фактическими классами. То, что вы пытаетесь сделать, очень просто, но вы, кажется, приближаетесь к нему с немного неправильного угла. – kch
Согласен, это сбивает с толку. Извините, я не мог объяснить это лучше! Спасибо за ваш ответ, я отправлю еще несколько кода, чтобы лучше описать сценарий. – pchap10k
Хорошо, я уже туша по вашему примеру. Понятно, что у меня были круглые колышки в квадратных отверстиях. Принимая ваш пример в качестве отправной точки, как я могу объявить объявление ** add_yaml_fields: foo,: bar ** в дочернем классе вместо родительского класса? Кроме того, у моего родителя есть несколько дочерних элементов, так что заявление ** write_inheritable_array (: yaml_fields, ...) ** вызывает проблемы между Child1, Child2 и т. Д. ...? Спасибо заранее, и да YAML прекрасен. – pchap10k