Интеграция apotomo со страницами RefineryCMS - PullRequest
2 голосов
/ 19 мая 2011

Я хотел бы расширить PagesController от RefineryCMS для использования некоторых виджетов apotomo в нашем проекте.

Я мог бы потенциально сделать «переопределение» PagesController, которое копирует его в мой проект, но я использую другой движок, который расширяет PagesController (модифицируя методы show и home с использованием подхода к патчированию модулей / обезьян) I ' Я бы предпочел этого избежать.

Мой первоначальный подход был примерно таким:

в config / application.rb:

config.before_initialize do
  require 'pages_controller_extensions'
end

config.to_prepare do
  PagesController.send :include, Refspike::Extensions
end

In pages_controller_extensions:

module Refspike
  module Extensions
    class << PagesController
      include Apotomo::Rails::ControllerMethods
      has_widgets do |root|
        root << widget(:map)
      end
    end
  end
end

К сожалению, это взрывается в строке "helper ActionViewMethods" в controller_methods apotomo. Добавление include Apotomo :: Rails :: ActionViewMethods не помогло.

Полагаю, я просто получаю базовые сведения об управлении зависимостями rails или, возможно, неправильные открытые классы ruby. Есть ли альтернативный подход, или я упускаю что-то простое?

Ответы [ 2 ]

0 голосов
/ 25 мая 2011

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

0 голосов
/ 19 мая 2011

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

...