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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top