Rails 可安装引擎的 prepend_view_path

2024-06-25

一方面,我有一个可安装的发动机,比如说前轮 前面包含我的资产和几页 它与 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 我的 preprend_front 方法创建了这个:~/main_app/app/views/front

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

prepend_view_path "#{Rails.root}/vendor/private_gems/front-0.0.2/app/views/front"

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

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


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

解决方案(仅在 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'

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 可安装引擎的 prepend_view_path 的相关文章

随机推荐