Rails - alias_method_chain с методом attribute = - PullRequest
2 голосов
/ 20 января 2010

Я хотел бы «добавить» некоторый код метода модели через модуль, когда он включен. Я думаю, что я должен использовать alias_method_chain, но я не знаю, как его использовать, поскольку мой «метод с псевдонимом» является одним из тех методов, заканчивающихся на знак «=»:

class MyModel < ActiveRecord::Base

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

end

Вот так выглядит мой модуль прямо сейчас:

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

Я получаю ошибку при определении функции. Как обойти это?

1 Ответ

8 голосов
/ 20 января 2010

alias_method_chain - простой двухстрочный метод:

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

Я думаю, что вы хотите просто ответить на два alias_method вызова в этом случае:

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

И вы бы определили свой метод так:

def foo_with_bar=(value)
  ...
end

Символы Ruby обрабатывают завершающие = и ? имен методов без проблем.

...