Rails - alias_method_chain con un método 'atributo ='
-
21-09-2019 - |
Pregunta
Me gustaría 'agregar' algún código en el método de un modelo a través de un módulo, cuando está incluido. Creo que debería usar alias_method_chain, pero no sé cómo usarlo, ya que mi 'método alias' es uno de esos métodos que terminan en el signo '=':
class MyModel < ActiveRecord::Base
def foo=(value)
... do stuff with value
end
end
Así que esto es lo que parece mi módulo ahora mismo:
module MyModule
def self.included(base)
base.send(:include, InstanceMethods)
base.class_eval do
alias_method_chain 'foo=', :bar
end
end
module InstanceMethods
def foo=_with_bar(value) # ERROR HERE
... do more stuff with value
end
end
end
Recibo un error en la definición de función. ¿Cómo puede evitar esto?
Solución
alias_method_chain
es un método simple de dos líneas:
def alias_method_chain( target, feature )
alias_method "#{target}_without_#{feature}", target
alias_method target, "#{target}_with_#{feature}"
end
Creo que la respuesta que quieres es simplemente hacer los dos alias_method
se llama en este caso:
alias_method :foo_without_bar=, :foo=
alias_method :foo=, :foo_with_bar=
Y definirías tu método así:
def foo_with_bar=(value)
...
end
Los símbolos de Ruby procesan el final =
y ?
de nombres de métodos sin problemas.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow