Интеграция apotomo со страницами RefineryCMS
Я хотел бы расширить PagesController от RefineryCMS для использования некоторых виджетов apotomo в нашем проекте.
Я мог бы потенциально сделать "переопределение" PagesController, которое копирует его в мой проект, но я использую другой движок, который расширяет PagesController (модифицируя методы show и home с использованием подхода к патчированию модулей / обезьян), я бы предпочел избежать тот.
Мой первоначальный подход был примерно таким:
в config/application.rb:
config.before_initialize do
require 'pages_controller_extensions'
end
config.to_prepare do
PagesController.send :include, Refspike::Extensions
end
В pages_controller_extensions:
module Refspike
module Extensions
class << PagesController
include Apotomo::Rails::ControllerMethods
has_widgets do |root|
root << widget(:map)
end
end
end
end
К сожалению, это взрывается в строке "вспомогательные ActionViewMethods" в apotomo's controller_methods. Добавление include Apotomo::Rails::ActionViewMethods не помогло.
Полагаю, я просто получаю базовые сведения об управлении зависимостями rails или, возможно, неправильные открытые классы ruby. Есть ли альтернативный подход, или что-то простое я пропускаю?
2 ответа
Вот решение. Удалите материал before_initialize; просто не нужно, чтобы это было в модуле. В application.rb выполните:
config.to_prepare do
::PagesController.send :include, Apotomo::Rails::ControllerMethods
::PagesController.has_widgets do |root|
root << widget(:map)
end
end
Затем переопределите общий /_content_page.html.erb НПЗ для включения:
<%=render_widget :map %>
Сделано и сделано.
Что было не так раньше? Ну звонит ::PagesController.send :include, Refspike::Extensions
означает, что я на самом деле "почти" в рамках класса, который я пытаюсь изменить, но не совсем. Итак, повторное открытие класса не нужно, с одной стороны. Но метод ActiveSupport, class_inheritable_array, вызываемый apotomo, по-видимому, также не может быть обнаружен в моей области видимости модуля, поэтому я не могу сойтись с чем-то вроде:
#doesn't work
module Refspike
module Extensions
include Apotomo::Rails::ControllerMethods
has_widgets do |root|
root << widget(:map)
end
end
end
К счастью, 4 строки кода в application.rb - более простое решение, и мне это удается.