1

act_as_textiled と has_foreign_language プラグインを一緒に使用すると問題が発生します。

TextElementアプリ内のモデル

class TextElement < ActiveRecord::Base
    has_foreign_language :value
    acts_as_textiled :value

HasForeignLanguage

def has_foreign_language(*args)
    args.each do |field|
        # Define the Getter
        define_method(field.to_s) do
        .
        .
        .

ActsAsTextiled

def acts_as_textiled(*attributes)
.
.
.
  attributes.each do |attribute|
    define_method(attribute) do |*type|
.
.
.

両方のプラグインは define_method を使用し、どちらの方法でも TextElement でミックスインを呼び出します。後者は以前に定義されたゲッターをオーバーライドします。

既存のゲッターを保存して、新しく定義されたゲッターでそれを呼び出す方法はありますか? 継承された場合に super を使用するのと同様です。

私はこれらのプラグインをフォークしたので、すべてが公正なゲームです。

すべての助けに感謝します。

4

2 に答える 2

1

または、alias_method_chain を使用してこれら 2 つを書き換えることもできます。

def some_class_method_that_overrides(*columns)
  columns.each do | c |
    overriden_name = if instance_methods.include?(c)
      alias_method_chain(c.to_sym, "extra")
      "#{c}_with_extra"
    else
      c
    end
    define_method(overriden_name) do ...
    end
  end
end
于 2010-01-12T21:45:17.987 に答える
0

属性を再定義する代わりに、プラグインの 1 つに属性を装飾させることができます。のようなもの (ここではオブジェクトを拡張していますが、必要な人は誰でも拡張できます):

class Object
  def decorate!(attr)
    method = self.method(attr)
    define_method(attr) do |value|
      result = method.call(value)
      yield(result)
    end
  end
end

だからデコレート!act_as_textilized でこれを試すことができます

def acts_as_textiled(*attributes)
.
  attributes.each do |attribute|
    self.decorate!(attribute) do |return_value_of_decorated_method|
    # decorate code here

または、それらの線に沿った何か。テストされていないため、微調整が必​​要になる場合がありますが、基本的な考え方はそこにあると思います。

于 2010-01-12T18:26:46.037 に答える