Понимание создания act_as_anything - PullRequest
1 голос
/ 27 января 2011

Я успешно создал гем, имеющий некоторые классы и модули, которые могут быть похожи на что-то подобное в ЛЮБОМ классе в проекте Rails:

class AnyRubyOrActiveModelClass
  acts_as_anything [:foo, :bar]

  def foo
    .. do some foo
  end

  def self.bar
    .. do some bar
  end
end

Для этого я создал Модуль вмой драгоценный камень, который выглядел примерно так:

module InstanceMagic
  class << self.class.superclass
  define_method(:acts_as_anything) do |methods|
    self.class_eval do
      include ClassMagic
      .. do some alias_method with given methods
    end
  end
end

Этот модуль успешно связал мой метод: foo из приведенного выше примера, второй модуль ClassMagic сделал то же самое для моего метода: bar class (следуя совету here ).

В тестовом проекте этот подход работал очень хорошо.В реальном проекте это привело к вмешательству в другой драгоценный камень, использующий, возможно, похожий подход.Этот драгоценный камень жаловался на отсутствующие методы в классе, даже когда я только интегрировал свой драгоценный камень в проект - даже не интегрировал Act_as_anything в класс.

Итак, я разбил свой код только на следующее:

module InstanceMagic
  class << self.class.superclass
  define_method(:acts_as_anything) do |methods|
    #really empty here
  end
end

В результате другой драгоценный камень все еще ломается.

Я использовал класс << self.class.superclass для явного расширения Object, так что это затрагивает даже классы, отличные от ActiveSomething, но ВСЕ классы, и мой act_as_anything доступен.Итак, я остаюсь с тремя вопросами. </p>

Почему последние 5 строк кода ломают другой драгоценный камень и заставляют его жаловаться на отсутствующие методы, которые он пытается динамически создать?Я хотел бы понять.

Есть ли лучший подход для достижения моей цели?

Когда я использую method_added и singleton_method_added (что я на самом деле делаю внутри своих модулей), я должен искать эти методысуществуют ли они уже, под псевдонимом «оригинальные», вставьте мои и назовите оригинальные после того, как я выполню свою работу?

Зная, что это много, я все еще надеюсь, что кто-то может направить меня в правильном направлении.

Спасибо.Felix

1 Ответ

0 голосов
/ 01 февраля 2011

Единственное, о чем я могу думать, это какая-то зависимость от порядка (длинный выстрел).Попробуйте поместить свой код в инициализатор в приложении rails и посмотрите, вызывает ли он те же проблемы.

...