Ich habe eine ziemlich eindeutige Klasse, die es ihren untergeordneten Klassen ermöglicht, virtuelle Felder zu deklarieren. Das Kind kann virtuelle Felder als XML gespeichert deklarieren, indem ein Verfahren der Elternklasse wie diese Aufruf:Wie rufen Sie attr_accessible dynamisch in Rails auf?
class Child1 < Parent
create_xml_field ["readings", "usage"]
end
Ich habe es geschafft, um es um über eine unangenehme Arbeit zu arbeiten. Die create_xml_field Methode speichert die Feldnamen in der Klassenvariablen (siehe unten). Die init_xml_fields Methode wird von innerhalb der after_initialize Methode aufgerufen.
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
Nasty genug? Ich bin nicht stolz, aber ich habe Probleme, es zum Laufen zu bringen. Außerdem funktioniert die Umgehung nicht mit der Massenzuweisung von Formularparametern.
Hat jemand Erfahrung, attr_accessible dynamisch aufzurufen, um Massenzuweisungen in der Kindklasse zuzulassen? Vielen Dank im Voraus!
Dieser Beitrag wurde zur besseren Lesbarkeit bearbeitet!
Das ist alles sehr verwirrend, aber es scheint mir, dass Sie eine Instanz Methode sind dem Aufruf der Klasse zu ändern, die eine Eigenklasse für diese bestimmte Instanz schaffen würde. Es würde helfen, wenn Sie ein minimales Beispiel mit Ihren tatsächlichen Klassen gepostet haben. Was Sie versuchen, ist sehr einfach, aber Sie scheinen es aus einem etwas falschen Winkel zu nähern. – kch
Einverstanden, es ist verwirrend. Tut mir leid, ich konnte es nicht besser erklären! Vielen Dank für Ihre Antwort. Ich poste noch mehr Code, um das Szenario besser zu beschreiben. – pchap10k
Okay, ich habe dein Beispiel verdüstert. Es ist klar, dass ich einige runde Stifte in quadratischen Löchern hatte. Nehmen wir als Beispiel Ihr Beispiel: Wie kann ich die Deklaration ** add_yaml_fields: foo,: bar ** in der Kindklasse statt in der Elternklasse deklarieren? Auch mein Elternteil hat mehrere Kinder, so verursacht die ** write_inheritable_array (: yaml_fields, ...) ** Deklaration Probleme zwischen Child1, Child2, etc ...? Vielen Dank im Voraus, und ja YAML ist schön. – pchap10k