ruby-on-rails – 如何在Rails 3.1资产管道中动态地要求资产?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 如何在Rails 3.1资产管道中动态地要求资产?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个基于插件的系统,我用于Rails中的应用程序开发.每个插件都实现了一个带有MVC组件的引擎等.主应用程序只是将所有工作委托给所安装的插件的空线程.

我正在从Rails 2.3.5升级到Rails 3.1,并试图让资产管道与我的框架一起工作.

我遇到的问题是尝试以编程方式要求我的插件的资产,例如application.js清单.

我可以手动添加它们:

  1. //= require <plugin_manifest_path>

一切都按预期工作.然而,由于我的框架中有几十个插件,每个安装都有不同的组合,所以我想根据安装的插件来更改这个清单.我试过这个解决方案:

  1. <%=
  2. Rails.plugins.collect do |plugin|
  3. "//= require #{plugin}"
  4. end.join("\n")
  5. %>

但是我发现资产管道编译的需求/指令阶段是在再培训局扩充之前发生的,所以生成的意见只是作为评论结束.

是否有另一种机制包含编译可能有效的路径?在指令处理之前预先处理清单文件的任何方式?

如果我不能想到更好的东西,我可能必须编写一个在部署时生成一个plugin.js清单文件的耙子/部署任务,但如果可能,我会喜欢更清晰和更优雅的东西.谢谢!

编辑:找到解决方案,一旦stackoverflow让我发布完整的解决方案.同时见下面的评论

解决方法

好的,所以这里的解决方案:

在内部,资产管道(也称为Sprockets)需要指令调用context.require_asset()来实际需要指令中指定的任何路径.原来,这意味着在ERB扩展期间,require_asset方法存在并可用.所以,正确的解决方案是:

  1. // ... Standard application.js stuff here ...
  2. //= require_tree .
  3. <%
  4. Rails.plugins.each do |plugin|
  5. require_asset(plugin.to_s)
  6. end
  7. %>

补充说,并且都按预期工作.呼!

如果您想知道Rails.plugins位,我添加了一个扩展到Rails模块,以获取加载的插件的实际列表,按照加载顺序,基于config.plugins.为了完整,这里是:

  1. module Rails
  2. def self.plugins
  3. # Get sorted list of all installed plugins
  4. all = Dir.glob(Rails.path('vendor/plugins/*/init.rb')).collect {|p| p.extract(/\/([^\/]+)\/init.rb$/) }
  5. all.sort!
  6. all.collect! {|p| p.to_sym }
  7.  
  8. # Get our load order specification
  9. load_order = Rails.application.config.plugins
  10.  
  11. # Split the load order out,and re-assemble replacing the :all keyword with the
  12. # set of plugins not in head or tail
  13. head,tail = load_order.split(:all)
  14. all -= head
  15. all -= tail
  16.  
  17. # All set!
  18. head + all + tail
  19. end
  20. end

最后的细节是在每个插件的app / assets / javascripts目录中创建一个< plugin_name> .js清单文件.

希望能帮助别人!

猜你在找的Ruby相关文章