3

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

4

2 回答 2

3

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

Rails.application.config.assets.paths

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

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

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

apps/assets/javascripts/myscripts/hello.js您可以通过访问http://mydomain.com/assets/myscripts/hello.js来加载位于的资产。

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

于 2011-05-28T11:38:55.817 回答
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。您可能会猜到这是require_tree在您的 JavaScript 文件中添加的行。

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

require_tree指令递归地包含 app/assets/javascripts 目录中的所有文件。因此,您可以通过创建一个子目录并将您不希望包含的文件放置在其中来实现您想要的。然后您可以更改require_treerequire_path.

对此的替代方法是手动管理 Sprockets 包含的文件,require filename用于每个所需的 JavaScript 文件。

于 2011-05-26T13:49:09.777 回答