alias_attribute und das Erstellen und das Verfahren mit dem ursprünglichen Attributnamen verursacht eine Schleife
-
05-10-2019 - |
Frage
versucht Im dynamisch eine Methode Kette in einem Attribute in meinem Modell zu erstellen. Inzwischen habe ich diese Funktion:
def create_filtered_attribute(attribute_name)
alias_attribute "#{attribute_name}_without_filter", attribute_name
define_method "#{attribute_name}" do
filter_words(self.send("#{attribute_name}_without_filter"))
end
end
so erhalte ich eine Zeichenfolge mit dem Attributnamen, alias es für ‚ _without_filter ‘ (alias_method oder alias_method_chain versagt hier, da das Attribut ist nicht da, wenn die Klasse erstellt wird), und ich eine neue Methode mit dem Attributnamen, wo ich seinen Inhalt filtern.
Aber irgendwie, wenn ich rufe „# {attribute_name} _without_filter“ ruft meine neue Methode (ich glaube, weil die alias_attribute einige, wie), und das Programm in einen Stapel Schleife geht.
Im Versuch, dieses Attribut zu benennen, so dass ich seinen Namen für eine Methode verwenden kann ...
Kann jemand bitte mich zu diesem Thema aufklären.
Lösung
Es gibt einen Unterschied zwischen alias_method
und alias_attribute
. alias_method macht eigentlich eine Kopieren der alten Methode, während alias_attribute nur definiert neue Methoden, die em <> rufen alte .
Beachten Sie, dass model.attribute
und model.attribute=
Methoden in Active rufen Sie einfach read_attribute und write_attribute , so dass Sie immer Zugriff auf Ihre Attribut, auch wenn Sie es der Getter oder Setter außer Kraft setzen:
define_method "#{attribute_name}" do
filter_words(self.read_attribute(attribute_name))
end