rails prepend_view_path 可安装引擎

Pro*_*ear 7 layout ruby-on-rails partial-views prepend rails-engines

一方面,我有一个可安装的引擎,假设 Front Front 包含我的资产和几页它与 MainApp 隔离。我不希望它触及主应用程序。

另一方面,我希望我的 MainApp 使用布局和部分 Front。所以我这样设置布局:

class ApplicationController < ActionController::Base
    layout 'front/application'
end
Run Code Online (Sandbox Code Playgroud)

但是前端/应用直接引用引擎部分,因为隔离,像这样

render 'header' # front/ prefix is not required
Run Code Online (Sandbox Code Playgroud)

所以 MainApp 视图尝试加载 app/views/application/header 而不是 app/views/front/application/header

为了解决这个问题,我像这样放置了一个 prepend_view_path :

class ApplicationController < ActionController::Base
    layout 'front/application'
    before_filter :prepend_front
protected
    def prepend_front
       prepend_view_path "app/views/front"
    end
end
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为引擎路径指向供应商。引擎将它自己添加到 prepend 路径列表中:~/main_app/vendor/private_gems/front-0.0.2/app/views 而我的 prepred_front 方法创建了这个:~/main_app/app/views/front

我试图强行添加正确的路径(但它看起来很脏):

prepend_view_path "#{Rails.root}/vendor/private_gems/front-0.0.2/app/views/front"
Run Code Online (Sandbox Code Playgroud)

我不工作,只是使应用程序崩溃...

而我被困在这里。也许我的设计是错误的?

Pro*_*ear 0

最后我删除了isolate属性。我将视图文件夹向上移动了一个文件夹,移出了 engine_app 文件夹。

唯一的最终调整是将 EngineApp::Engine.url_helper 包含到 MainApp 应用程序控制器中。

前置堆栈如下所示:

  • 主应用程序前置路径
  • 主要应用程序视图
  • 发动机视图

所以它是基于引擎的,然后在顶部添加主要应用程序的东西。