Прежде всего: да, исправление обезьян плохо, я уже чувствую себя грешником.Но в этом случае я не нашел другого решения.
Ситуация:
Механизм 1 (Alchemy-CMS): Предоставляет модель страницы, которая содержит несколько элементов.
Механизм2 (мой Alchemy-Contentable): должен обеспечить способ привязки этих элементов к любому ресурсу (= модели), который вам нравится.
Цель состоит в том, чтобы предоставить ресурсу cms-возможности, как у Alchemy, что означает добавление таких элементов, какзаголовки, абзацы, картинки, видео ...
На "слое страницы" все нормально.Я создал миксин для модели, которая идентифицирует себя как способную к элементу.
Я хочу оставаться как можно ближе к алхимии, и поэтому наследование от элемента не является вариантом (новая таблица базы данных, новые связанные модели...).Таким образом, патчирование обезьян здесь вполне оправдано (все еще хакерство, но я думаю, на этот раз я в порядке).
Проблема:
Как мне успешно обезопасить патчи классов одного движка от другого движка?Когда я пытаюсь открыть классы, как обычно, жалуется, что не находит константу.Вероятно, это связано с отложенной загрузкой классов.
Что работает:
config.after_initialize do
Alchemy::Admin::ElementsController.send(:include, AlchemyContentable::ElementsControllerMixin)
Alchemy::Admin::ElementsController.send(:before_filter, :load_contentable_to_page, :only => [:index, :new, :create])
end
, но это может привести к ошибкам, особенно при доступе к недавно определенному сообщению из миксина (например, Alchemy).:: Element.my_new_method в model_mixin, который входит в модель вашего приложения)
У кого-нибудь была подобная ситуация раньше?Есть ли выход?По крайней мере, «надежный» способ создавать и перезаписывать некоторые методы в классах движка и вызывать их внутри миксина?