在新的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参考不起作用?
答案 0 :(得分:1)
在开发中,如下所示:
// app/assets/javascripts/foo.js
//= require bar
//= require baz
使用Rails资产助手:
<%= javascript_include_tag "foo" %>
Rails会为foo.js
创建一个脚本标记,为bar
和baz
创建一个标记。附加文件名是摘要 - 这是一个校验和,用作缓存生成器机制,因此您不必处理生产中的浏览器缓存问题。
通过使用单独的脚本标记,您可以更轻松地进行故障排除,因为您在单个文件中获得了行号 - 而不是在连接文件中*。
在生产中,您可以在部署之前编译资产,也可以设置一个提交相同的post commit hook。后者通常不易出现人为错误,并且在git历史中产生的噪音更少。
编译Rails时会将bar
和baz
连接到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