我正在Rails3中编写一个模块化项目,我就是这个问题。
我是我的主要项目,我想用不同的自定义实现它的一部分,所以我使用Engine,所以我:
- app
- views
- shared
- _header.html.erb <-- This one is called
- ...
- config
- ...
- vendors
- plugins
- myplugin
- app
- views
- controller1
- action1.html.erb
- shared
- _header.html.erb <--- I want to render this!
但是如果从action1.html.erb我打电话
<%= render 'shared/header' %>
调用第一个_header.html.erb,我想在myplugin中调用“之前”。我可以只为myplugin中的视图执行此操作吗?
这让我可以防止很多无用的“命名空间”。
答案 0 :(得分:2)
我们遇到了完全相同的问题,并想出了类似的结果:
def self.prioritize_engine_view_paths!(engine)
self.view_paths = engine.paths["app/views"].existent + MyApp::Application.paths["app/views"].existent
end
在主应用程序的ApplicationController中定义,然后在每个引擎的ApplicationController中调用它:
module MyEngine
class ApplicationController < ::ApplicationController
prioritize_engine_view_paths!(MyEngine::Engine)
end
end
[编辑]在Rails 3.2.0中,它会更容易:
config.railties_order = [Blog::Engine, :main_app, :all]
有关详细信息,请参阅https://github.com/rails/rails/commit/40b19e063592fc30705f17aafe6a458e7b622ff2。