Integrando apotomo com páginas RefineryCMS
-
15-11-2019 - |
Pergunta
Gostaria de estender o PagesController do RefineryCMS para usar alguns widgets apotomo em nosso projeto.
Eu poderia potencialmente fazer uma "substituição" do PagesController, que o copia em meu projeto, mas estou usando outro mecanismo que estende o PagesController (modificando os métodos show e home usando uma abordagem de patch de módulo/macaco). que.
Minha abordagem inicial foi mais ou menos assim:
em config/application.rb:
config.before_initialize do
require 'pages_controller_extensions'
end
config.to_prepare do
PagesController.send :include, Refspike::Extensions
end
Em páginas_controller_extensions:
module Refspike
module Extensions
class << PagesController
include Apotomo::Rails::ControllerMethods
has_widgets do |root|
root << widget(:map)
end
end
end
end
Infelizmente, isso explode na linha "helper ActionViewMethods" nos controller_methods do apotomo.Adicionar include Apotomo::Rails::ActionViewMethods não ajudou.
Presumo que estou apenas obtendo detalhes básicos sobre o gerenciamento de dependências do Rails ou talvez as classes abertas do Ruby estejam erradas.Existe uma abordagem alternativa ou algo simples que estou ignorando?
Solução 2
Aqui está a solução.Remova o material before_initialize;simplesmente não há necessidade de que isso esteja em um módulo.Em application.rb, faça:
config.to_prepare do
::PagesController.send :include, Apotomo::Rails::ControllerMethods
::PagesController.has_widgets do |root|
root << widget(:map)
end
end
Em seguida, substitua shared/_content_page.html.erb da refinaria para incluir:
<%=render_widget :map %>
Feito e feito.
O que havia de errado antes?Bem, ligando ::PagesController.send :include, Refspike::Extensions
significa que estou "quase" no escopo da classe que estou tentando modificar, mas não exatamente.Portanto, reabrir a aula é desnecessário, por um lado.Mas um método ActiveSupport, class_inheritable_array sendo chamado por apotomo, aparentemente também não pode ser descoberto no escopo do meu módulo, então não posso fazer algo como:
#doesn't work
module Refspike
module Extensions
include Apotomo::Rails::ControllerMethods
has_widgets do |root|
root << widget(:map)
end
end
end
Felizmente, as 4 linhas de código no application.rb são uma solução mais simples e isso funciona para mim.
Outras dicas
O PagesController é um ActionController derivado?