1

我在同时使用acts_as_textiled 和has_foreign_language 插件时遇到问题。

TextElement我的应用程序中的模型

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

有外语

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

纺织业

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

两个插件都使用define_method,无论哪种方式,我都会在TextElement中调用mixins,后者会覆盖先前定义的getter。

有没有办法保存现有的 getter 并在新定义的 getter 中调用它?如果它们是继承的,则类似于使用 super 。

我已经分叉了这些插件,所以那里都是公平的游戏。

所有帮助表示赞赏。

4

2 回答 2

1

或者,您可以使用 alias_method_chain 重写这两个。

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

您可以尝试让其中一个插件装饰属性而不是重新定义它们。类似的东西(我在这里扩展 Object 但你可以扩展任何需要它的人):

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

所以用装饰!你可以在acts_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 回答