Интеграция apotomo со страницами RefineryCMS

#ruby-on-rails #ruby #refinerycms #apotomo

#ruby-on-rails #ruby #refinerycms #apotomo

Вопрос:

Я хотел бы расширить 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. Добавление Apotomo::Rails::ACTIONVIEWMETHOD не помогло.

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

Комментарии:

1. Конкретное сообщение об ошибке является block in <module:ControllerMethods>': undefined method вспомогательным’ для #<Class:PagesController> (NoMethodError) , FWIW.

Ответ №1:

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

Комментарии:

1. Да. (Хотя вы, возможно, захотите перефразировать это как комментарий, а не как ответ: P )

2. Более конкретно, он является производным от ApplicationController, который является производным от ActionController::Base. github.com/resolve/refinerycms/blob/master/pages/app /…

Ответ №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
  

Затем переопределите общий файл refinery /_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 являются более простым решением, и это делает свое дело для меня.