#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 являются более простым решением, и это делает свое дело для меня.