7

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

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

class ApplicationController < ActionController::Base
    layout 'front/application'
end

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

render 'header' # front/ prefix is not required

所以 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

但这不起作用,因为引擎路径指向供应商。引擎将它自己添加到前置路径列表中:~/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"

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

我被困在这里。也许我的设计错了?

4

3 回答 3

3

Jack 的答案是完美的,除非您想在 Rails 引擎中执行此操作(例如,如果您的引擎本身具有需要不同加载路径的“主题”)。在这种情况下, prepend_path 和 append_path 不合适,因为您将要在引擎默认加载路径之前但在应用程序加载路径之后插入新加载路径。

对此的解决方案(仅在 Rails 3.2 中测试)是将以下内容添加到您的引擎 /lib/my_engine.rb 文件中:

config.after_initialize do
  my_engine_root = MyEngine::Engine.root.to_s
  paths = ActionController::Base.view_paths.collect{|p| p.to_s}
  paths = paths.insert(paths.index(my_engine_root + '/app/views'), my_engine_root + '/app/views/themes/my_theme')
  ActionController::Base.view_paths = paths
end

新的加载路径my_engine_root + '/app/views/themes/my_theme'现在将在您的引擎标准加载路径之前my_engine_root + '/app/views'

于 2014-10-28T11:15:42.553 回答
1

默认情况下,Rails 在 vi​​ews/ 中查找文件,但如果找不到,它会在引擎的 views/ 中查找。这意味着您必须附加视图路径,以便 Rails 将在主应用程序的 views/ 中查找,然后在引擎中查看修改后的路径,最后在引擎的 views/ 中查找。这将是堆栈:

  • 主要应用程序视图/
  • 引擎修改路径(视图/前/内部引擎)
  • 引擎视图/

为此,请进入application_controller.rb

class ApplicationController < ActionController::Base

    before_filter :set_views_path

    def set_views_path
        append_view_path FnetIdentityRailsEngine::Engine.root.join('app', 'views', 'front')
    end
end

如果您在引擎中使用修改后的路径添加视图路径,您将无法覆盖主应用程序中的引擎视图。这就是你想要追加的原因。

于 2014-01-10T18:35:54.760 回答
0

最后我删除了隔离属性。我将视图上移了一个文件夹,因此从 engine_app 文件夹中移出。

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

前置堆栈如下所示:

  • 主应用程序前置路径
  • 主要应用程序视图
  • 引擎视图

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

于 2012-03-20T11:45:53.210 回答