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?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top