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

时间:2011-05-26 11:53:30

标签: ruby-on-rails sprockets

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

2 个答案:

答案 0 :(得分:3)

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.js的资产。

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

答案 1 :(得分:1)

似乎没有一种简单的方法可以实现这一目标。在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指令的大量文档。但是,source code已有详细记录,并且很好地解释了可用的指令。

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

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