我想扩展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类。是否有其他方法,或者我忽略的简单方法?
答案 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行代码是一个更简单的解决方案,这对我有用。