2013-02-26 181 views
1

我有一个脚本,基本上是用户嵌入的“小部件”。直接链接到资产管道中的编译资源?

它只是简单的香草JavaScript,并没有任何要求的其他资源。它位于/app/assets/javascripts/delivery.js

我想要做的是让文件得到压缩/编译,然后让用户从脚本标记直接链接到它,即。 <script src="http://example.com/assets/delivery.js"></script>

但现在......这是一个不行。该文件在生产中不存在。

那么,我怎样才能像管道中的任何其他JS文件一样压缩该文件,然后直接链接到它?

+0

这是什么'link'?您的描述几乎是[asset-pipeline]的默认功能(http://guides.rubyonrails.org/asset_pipeline.html)。 – 2013-02-26 18:29:29

+0

这将是'http:// example.com/assets/delivery.js'。我在'/ app/assets/javascripts/delivery.js'中存在'delivery.js',我希望能够链接到'/ assets/delivery.js'的生产环境中,但是现在当我这样做时,我收到“找不到页面”错误。 – Shpigford 2013-02-26 20:41:56

+0

我建议将它放在'public /'中(假设它将处于生产模式)。 – 2013-02-26 22:46:55

回答

3

如果添加

config.assets.precompile += ['delivery.js'] 

您application.rb中,然后delivery.js将被视为一个清单文件:它会被预编译,并担任了在生产delivery.js。清单文件通常只是一系列//= require(或//= require_directory)语句,但它们包含的任何JavaScript也将被添加到生成的文件中。

默认情况下,application.js清单包含了所有内容 - 您想要调整此设置,以便它不包含仅用于单独服务的JavaScript。

+0

我爱你。这已经躲过了我好几天。你赢了。 :) – Shpigford 2013-02-28 16:05:09

0

首先,确保您的app/assets/javascripts/delivery.js不在您的顶级“清单”JavaScript文件中,即app/assets/javascripts/application.js。 application.js通常包含//= require_tree .,所以它默认包含你的delivery.js。你需要改变它。将“require_tree”替换为您希望在application.js中进行预编译和组合的所有资产的单个“require”语句。

接下来,更新你的环境文件(生产ENV配置/环境/ production.rb),包括在预编译的资产清单文件:

config.assets.precompile += %w(delivery.js) 

现在,你把它作为一个单独的文件在公共/资产目录中,按照application.js的相同方式进行编译和压缩。请记住,它有一个类似于你的application.js的附加名称的摘要(除非你通过设置config.assets.digest = false来提供没有摘要的文件)。