我有一个带有
的Rails 4应用程序<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>
在头脑中。在开发过程中,将呈现以下HTML,并加载modernizr:
<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>
在制作中,渲染了followign HTML,并且未加载了modernizr(未找到404):
<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script>
在制作中,/assets/modernizr.js
被发现并可浏览。
Rails documentation表示javascript_include_tag
应生成
<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>
在制作中,我的stylesheet_link_tag
很好,链接到/assets/
目录。
为什么javascript_include_tag
在生产中链接到/javascripts
而不是/assets
,我该如何解决?
答案 0 :(得分:21)
AssetUrlHelper的一个用法语句表明它将生成/ javascripts / urls 喜欢你所看到的:
#asset_path“application”,输入:: javascript#=&gt; /javascripts/application.js
(来自asset_url_helper.rb第117行 - [1])
此代码看起来只有在缺少预编译资产时才能访问 所以看起来您的资产编译不起作用(我的部署通常是这样) 当发生这种情况时失败,所以也许你甚至没有开火。)
相同的asset_url_helper.rb调用/ javascripts / part'extname'和 使用以下映射来了解如何生成名称:
# Maps asset types to public directory.
ASSET_PUBLIC_DIRECTORIES = {
audio: '/audios',
font: '/fonts',
image: '/images',
javascript: '/javascripts',
stylesheet: '/stylesheets',
video: '/videos'
}
新的Rails 4应用程序在config / environments / production.rb
中有此功能 # Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = false
似乎与您所看到的行为相符。
答案 1 :(得分:12)
默认情况下,Rails只会预编译application.js
,application.css
以及它在资源路径中找到的所有图像。因此,在生产中,mordernizr将不会被预编译,因此javascript助手将无法找到该文件。
为了解决此问题,您可以通过修改production.rb
config.assets.precompile += ['modernizr.js']
有关详细信息,请参阅the Rails Guides
答案 2 :(得分:4)
请务必通过运行以下命令在生产中预编译资产:
RAILS_ENV=production bundle exec rake assets:precompile
资产管道上的Rails指南可以为您提供更多详细信息:http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
答案 3 :(得分:1)
我使用部署在Heroku上的Rails 4的新应用程序:
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
我的javascript应用程序。(指纹).js从src:assets / application.js调用
我认为您的问题来自于您的production.rb,他们从另一个位置定义资产。
所以也许你可以将Moderniz.js添加到
config.assets.precompile = [' .js',' .css','* .css.erb']
在config / production.rb
中或者只需要将modernizr脚本放入application.js
// = require mordernizr
并将modernizr脚本调用删除到您的布局中。
<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>
您可以查看application.js从哪里投放到您的生产环境中吗?
答案 4 :(得分:-1)
可能是因为此文件需要位于/ vendor / assets / javascript而不是/ app / assets / javascript。 Vendor文件夹用于javascript库,App文件夹用于代码。
比在布局中添加标记更好的解决方案是向application.js添加脚本引用,让sass编译器压缩并将其附加到主javascript文件中。
如果您没有得到明确的答案,请查看: http://guides.rubyonrails.org/asset_pipeline.html#asset-organization