alias_attribute e la creazione e il metodo con il nome dell'attributo originale provoca un loop
-
05-10-2019 - |
Domanda
Nel tentativo di creare dinamicamente una catena metodo in un attributo nel mio modello. Ormai ho questa funzione:
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
in modo da ricevere una stringa con il nome dell'attributo, alias esso per ' _without_filter ' (alias_method o alias_method_chain non riesce qui, perché l'isnt attributo lì quando viene creata la classe), e creo un nuovo metodo con il nome dell'attributo, dove a filtrare i contenuti.
Ma in qualche modo, quando lo chiamo "# {nome_attributo} _without_filter" si chiama il mio nuovo metodo (credo perché l'alias_attribute qualche modo), e il programma va in un ciclo di stack.
Nel tentativo di rinominare tale attributo, in modo da poter usare il suo nome per un metodo di ...
Qualcuno può per favore mi illumini su questo.
Soluzione
C'è una differenza tra il alias_method
e alias_attribute
. alias_method in realtà fa un copiare del vecchio metodo, mentre alias_attribute definisce nuovi metodi, che em <> chiamare quelli vecchi .
Si noti che model.attribute
e model.attribute=
metodi ActiveRecord chiamano semplicemente read_attribute e write_attribute , in modo sempre possibile accedere al proprio attributo, anche se si ignora che di getter o setter:
define_method "#{attribute_name}" do
filter_words(self.read_attribute(attribute_name))
end