Sto provando a sovrascrivere un metodo generato dinamicamente includendo un modulo.Perché includere questo modulo non sovrascrive un metodo generato dinamicamente?
Nell'esempio seguente, un'associazione Ripple aggiunge un metodo rows=
a Tabella. Voglio chiamare quel metodo, ma anche fare alcune cose aggiuntive in seguito.
Ho creato un modulo per sovrascrivere il metodo, pensando che il modulo row=
sia in grado di chiamare super
per utilizzare il metodo esistente.
class Table
# Ripple association - creates rows= method
many :rows, :class_name => Table::Row
# Hacky first attempt to use the dynamically-created
# method and also do additional stuff - I would actually
# move this code elsewhere if it worked
module RowNormalizer
def rows=(*args)
rows = super
rows.map!(&:normalize_prior_year)
end
end
include RowNormalizer
end
Tuttavia, il mio nuovo rows=
non viene mai chiamato, come dimostra il fatto che se alzo un'eccezione al suo interno, non succede nulla.
So che il modulo viene incluso, perché se inserisco questo, la mia eccezione viene sollevata.
included do
raise 'I got included, woo!'
end
Inoltre, se invece di rows=
, il modulo definisce somethingelse=
, tale metodo è richiamabile.
Perché il metodo del modulo non ha la precedenza su quello generato dinamicamente?
Stavo per alzarmi, ma poi ti sei fermato e hai lasciato tutti appesi. :-) –
Grazie! Avrei dovuto saperlo: ho scritto la catena di ereditarietà qui ... http://stackoverflow.com/questions/3492679/ruby-determining-method-origins :) –