2

我想扩展 RefineryCMS 的 PagesController 以在我们的项目中使用一些 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

不幸的是,这在 apotomo 的 controller_methods 中的“helper ActionViewMethods”行中爆炸了。添加 include Apotomo::Rails::ActionViewMethods 没有帮助。

我想我只是得到了关于 Rails 依赖管理的基本细节,或者可能是 ruby​​ 开放类错误。有没有其他方法,或者我忽略了一些简单的方法?

4

2 回答 2

0

PagesController 是派生的 ActionController 吗?

于 2011-05-19T12:11:02.953 回答
0

这是解决方案。删除 before_initialize 的东西;根本不需要它在一个模块中。在 application.rb 中,执行:

config.to_prepare do
  ::PagesController.send :include, Apotomo::Rails::ControllerMethods
  ::PagesController.has_widgets do |root|
    root << widget(:map)
  end
end

然后,覆盖炼油厂的 shared/_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

幸运的是,application.rb 中的 4 行代码是一个更简单的解决方案,这对我有用。

于 2011-05-24T22:36:52.730 回答