Pergunta

Eu gostaria de 'adicionar' algum código no método de um modelo por meio de um módulo, quando ele está incluído. Eu acho que devo usar o alias_method_chain, mas não sei como usá -lo, já que meu 'método de alias' é um daqueles métodos que terminam no sinal '=':

class MyModel < ActiveRecord::Base

  def foo=(value)
    ... do stuff with value
  end

end

Então é isso que meu módulo parece agora:

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

Eu recebo um erro na definição da função. Como contornar isso?

Foi útil?

Solução

alias_method_chain é um método simples de duas linhas:

def alias_method_chain( target, feature )
  alias_method "#{target}_without_#{feature}", target
  alias_method target, "#{target}_with_#{feature}"
end

Eu acho que a resposta que você deseja é simplesmente fazer os dois alias_method chama a si mesmo neste caso:

alias_method :foo_without_bar=, :foo=
alias_method :foo=, :foo_with_bar=

E você definiria seu método como assim:

def foo_with_bar=(value)
  ...
end

Os símbolos de rubi processam a trilha = e ? de nomes de métodos sem um problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top