2

モジュールが含まれている場合、モジュールを介してモデルのメソッドにコードを「追加」したいと思います。alias_method_chain を使用する必要があると思いますが、「エイリアス メソッド」は「=」記号で終わるメソッドの 1 つであるため、使用方法がわかりません。

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

関数定義でエラーが発生します。これをどのように回避しますか?

4

1 に答える 1

8

alias_method_chainは単純な2行の方法です。

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

この場合、あなたが望む答えは、alias_method自分で2つの呼び出しを行うことだと思います。

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

そして、あなたはそのようにあなたのメソッドを定義するでしょう:

def foo_with_bar=(value)
  ...
end

Rubyシンボルは、末尾=?メソッド名を問題なく処理します。

于 2010-01-20T17:56:36.100 に答える