将apotomo与RefineryCMS页面集成

时间:2011-05-18 23:48:27

标签: ruby-on-rails ruby refinerycms apotomo

我想扩展RefineryCMS的PagesController以在我们的项目中使用一些apotomo小部件。

我可能会对PagesController进行“覆盖”,将其复制到我的项目中,但我正在使用另一个扩展PagesController的引擎(使用模块/猴子修补方法修改show和home方法)我d宁可避免这种情况。

我最初的做法是这样的:

在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中的“帮助者ActionViewMethods”行上爆炸了。添加包括Apotomo :: Rails :: ActionViewMethods没有帮助。

我认为我只是得到有关rails依赖管理的基本细节,或者错误的ruby open类。是否有其他方法,或者我忽略的简单方法?

2 个答案:

答案 0 :(得分:0)

PagesController是派生的ActionController吗?

答案 1 :(得分: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

然后,覆盖refinery的shared / _content_page.html.erb以包含:

<%=render_widget :map %>

完成并完成。

以前出了什么问题?好吧,调用::PagesController.send :include, Refspike::Extensions意味着我实际上“几乎”在我试图修改的类的范围内,但并不完全。因此,一方面,重新开放课程是不必要的。但是一个ActiveSupport方法,由apotomo调用class_inheritable_array,显然在我的模块范围内是不可发现的,所以我无法逃避做类似的事情:

#doesn't work
module Refspike
  module Extensions
    include Apotomo::Rails::ControllerMethods
    has_widgets do |root|
      root << widget(:map)
    end
  end
end

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