Estoy intentando anular un método generado dinámicamente incluyendo un módulo.¿Por qué incluir este módulo no anula un método generado dinámicamente?
En el siguiente ejemplo, una asociación de Ondulación agrega un método rows=
a la Tabla. Quiero llamar a ese método, pero también hacer algunas cosas adicionales después.
Creé un módulo para anular el método, pensando que el módulo row=
podría llamar al super
para usar el método existente.
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
Sin embargo, mi nuevo rows=
nunca es llamado, como lo demuestra el hecho de que si levanto una excepción dentro de él, no pasa nada.
Sé que el módulo se está incluyendo, porque si pongo esto en él, mi excepción aumenta.
included do
raise 'I got included, woo!'
end
También, si en lugar de rows=
, el módulo define somethingelse=
, que el método es exigible.
¿Por qué mi método de módulo no reemplaza al generado dinámicamente?
Estaba a punto de votar, pero luego se apagó y dejó a todos colgados. :-) –
Gracias! Debería haber sabido esto: escribí la cadena de herencia aquí ... http://stackoverflow.com/questions/3492679/ruby-determining-method-origins :) –