Интеграция 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 - более простое решение, и мне это удается.

Является ли PagesController производным ActionController?

Другие вопросы по тегам