Rails 3.1:公共目录不再提供js资产。 如何在加载页面后加载其他js文件?

我使用一个jQuery插件,在初始页面加载后从服务器加载另一个js文件。 由于所有js资产在Rails 3.1中连接,并且公共目录不用于提供js资产,我如何引用此文件? 我把它放在哪里?

可以在运行时访问Sprockets加载路径中的每个资产。 您可以在Rails控制台中看到您的加载路径

Rails.application.config.assets.paths

您可以在初始化程序中添加加载路径:

Rails.application.config.assets.paths << your_load_path

默认情况下,自动加载apps / assets /和vendor / assets /中的所有资产。 这些资产必须位于目录中。 资源/目录本身中的文件未加载。

您可以访问http://mydomain.com/assets/myscripts/hello.js加载位于apps/assets/javascripts/myscripts/hello.jsapps/assets/javascripts/myscripts/hello.js

连接是一个单独的问题。 Sprockets将在加载路径中查找您使用Sprockets指定的资产,并provide指令并从中构建连接文件。

似乎没有一种简单的方法可以实现这一目标。 在Rails 3.1中,JavaScript和CSS文件现在都连接成单个文件以发送到浏览器。 这是使用Sprockets库完成的。

实现此目的的机制包括解析./app/assets/javascripts/application.js文件并查找将告诉Sprockets在哪里查找相关文件的Sprockets指令。

新生成的Rails应用程序中的全新application.js文件如下所示:

 // FIXME: Tell people that this is a manifest file, real code should go into discrete files // FIXME: Tell people how Sprockets and CoffeeScript works // //= require jquery //= require jquery_ujs //= require_tree . 

这些看起来像是对JavaScript的注释,但被Sprockets视为指令,告诉它如何构建将传递给客户端的单个application.js。 您可能会猜到,在JavaScript文件中添加了require_tree行。

似乎没有关于Sprockets指令的大量文档。 但是, 源代码已有详细记录,并且很好地解释了可用的指令。

require_tree指令递归地包含app / assets / javascripts目录中的所有文件。 因此,您可以通过创建子目录并将不希望包含的文件放在那里来实现您的目的。 然后,您可以将require_tree更改为require_path

替代方法是手动管理Sprockets包含的文件,使用每个必需JavaScript文件的require filename