为什么javascript_include_tag参考不起作用?

时间:2015-11-14 18:42:02

标签: javascript ruby-on-rails

在新的Rails应用程序中,它将包含以下标记,其中包含javascripts文件夹中的所有js文件:

<%= javascript_include_tag 'application'%>

它还会在运行时创建奇怪的js文件引用:

<script src="/assets/cbpAnimatedHeader.self-2f56b42e64e4cd1aeca79d75fab98d1e72c4ee686ded129c7b6bd100065c0c84.js?body=1"></script>

当我使用来自上述文件的页面上的函数时,我收到一个未找到的错误。

如果我改为添加此引用,一切正常:

<script src="assets/cbpAnimatedHeader.js"></script>

为什么javascript_include_tag参考不起作用?

2 个答案:

答案 0 :(得分:1)

将资产添加到Sprockets清单时,

在开发中,如下所示:

// app/assets/javascripts/foo.js
//= require bar
//= require baz

使用Rails资产助手:

 <%= javascript_include_tag "foo" %>

Rails会为foo.js创建一个脚本标记,为barbaz创建一个标记。附加文件名是摘要 - 这是一个校验和,用作缓存生成器机制,因此您不必处理生产中的浏览器缓存问题。

通过使用单独的脚本标记,您可以更轻松地进行故障排除,因为您在单个文件中获得了行号 - 而不是在连接文件中*。

在生产中,您可以在部署之前编译资产,也可以设置一个提交相同的post commit hook。后者通常不易出现人为错误,并且在git历史中产生的噪音更少。

编译Rails时会将barbaz连接到foo.js<%= javascript_include_tag "foo" %>使用foo.js创建一个脚本标记 - 再次将摘要包含为缓存清除机制。

为什么我会收到未定义的错误?

这很可能是导致排序不正确的原因 - 如果您的脚本具有必须可用的依赖项,您不应该依赖//= require_tree .来加载它!

相反,你会做类似的事情:

//= require 'cbpAnimatedHeader'
//= require_tree .

http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets

答案 1 :(得分:1)

  

在运行时奇怪的参考

他们是fingerprints of the asset file

指纹识别是一种使文件名依赖于文件内容的技术。文件内容更改时,文件名也会更改。对于静态或不经常更改的内容,这提供了一种简单的方法来判断文件的两个版本是否相同,即使是跨不同的服务器或部署日期。

这是Rails功能的标准部分 - 尤其是当您预编译您的资产&amp;在生产中运行它们。

-

  

为什么javascript_include_tag参考不起作用?

可能确实......

<%= javascript_include_tag 'application'%>

这会调用app/assets/application.js。虽然不是问题,但这意味着您必须确保已将所有js个文件包含在sprockets manifest directives中:

#app/assets/javascripts/application.js
// ...
//= require jquery
//= require jquery_ujs
//= require_tree .

必须注意以上内容在app/assets/javascripts文件夹中显示(cbpAnimatedHeader.js似乎在app/assets

考虑到你有app/assets/javascripts/cbpAnimatedHeader.js

,上述情况应该有效