gpt4 book ai didi

ruby-on-rails - 如何在 Rails 3.1 Assets 管道中动态要求 Assets ?

转载 作者:行者123 更新时间:2023-12-04 02:03:26 26 4
gpt4 key购买 nike

我有一个基于插件的系统,用于在 Rails 中进行应用程序开发。每个插件都使用 MVC 组件等实现一个引擎。主应用程序只是一个空的工具,它将所有工作委托(delegate)给已安装的插件。

我目前正在从 Rails 2.3.5 升级到 Rails 3.1,并试图让 Assets 管道与我的框架一起工作。

我遇到的问题是尝试以编程方式将我的插件的 Assets 要求到例如 application.js list 中。

我可以像这样手动添加它们:

//= require <plugin_manifest_path>

一切都按预期工作。但是,由于我的框架中有几十个插件,并且每次安装都有不同的组合,我希望根据安装的插件来更改 list 。我尝试将此作为解决方案:
<%=
Rails.plugins.collect do |plugin|
"//= require #{plugin}"
end.join("\n")
%>

但我发现, Assets 管道编译的 require/directive 阶段发生在 ERB 扩展之前,因此生成的评论只是以评论的形式结束。

是否有另一种机制可以包含可能有效的编译路径?在指令处理开始之前有什么方法可以预处理 list 文件?

如果我想不出更好的方法,我可能不得不编写一个 rake/deployment 任务,在部署时生成一个 plugin.js list 文件,但如果可能的话,我希望更清晰、更优雅。谢谢!

编辑 :找到解决方案,一旦stackoverflow允许我将发布完整的解决方案。同时请参阅下面的评论...

最佳答案

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

在内部, Assets 管道(又名 Sprockets)需要指令调用 context.require_asset()实际需要指令中指定的任何路径。原来,这意味着 require_asset方法在 ERB 扩展期间存在并且可用。因此,正确的解决方案是:

// ... Standard application.js stuff here ...
//= require_tree .
<%
Rails.plugins.each do |plugin|
require_asset(plugin.to_s)
end
%>

将其添加进去,一切都按预期工作。哇!

如果你想知道 Rails.plugins位,我向 Rails 模块添加了一个扩展,以根据 config.plugins 按加载顺序获取加载的插件的实际列表。为了完整起见,这里是:
module Rails
def self.plugins
# Get sorted list of all installed plugins
all = Dir.glob(Rails.path('vendor/plugins/*/init.rb')).collect {|p| p.extract(/\/([^\/]+)\/init.rb$/) }
all.sort!
all.collect! {|p| p.to_sym }

# Get our load order specification
load_order = Rails.application.config.plugins

# Split the load order out, and re-assemble replacing the :all keyword with the
# set of plugins not in head or tail
head, tail = load_order.split(:all)
all -= head
all -= tail

# All set!
head + all + tail
end
end

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

希望对某人有所帮助!

关于ruby-on-rails - 如何在 Rails 3.1 Assets 管道中动态要求 Assets ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8448838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com