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?

¿Fue útil?

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
scroll top