35

我有一个 Rails 4 应用程序

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>

在头上。在开发中,渲染了以下 HTML,并加载了modernizr:

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>

在生产中,渲染了以下 HTML,并且未加载modernizr (未找到 404):

<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script>

在生产中,/assets/modernizr.js被发现和浏览。

Rails文档javascript_include_tag应该生成

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>

在生产中,我stylesheet_link_tag的 s 很好,链接到/assets/目录。

为什么javascript_include_tag链接到/javascripts而不是/assets在生产中,我该如何解决?

4

5 回答 5

24

AssetUrlHelper 的使用声明之一表明它将生成 /javascripts/ url,就像您所看到的那样:

#asset_path "application", 输入: :javascript # => /javascripts/application.js

(来自asset_url_helper.rb 第117行-[ 1 ])

这段代码看起来只有在缺少预编译资产的情况下才能访问它,因此看起来您的资产编译不起作用(当这种情况发生时,我的部署通常会失败,所以您的部署可能甚至没有触发)。

相同的asset_url_helper.rb 调用/javascripts/ 部分'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

这似乎与您所看到的行为相匹配。

于 2013-10-06T23:17:05.003 回答
12

默认情况下,Rails 只预编译application.jsapplication.css以及它在资产路径中找到的任何图像。因此,在生产中,mordernizr 不会被预编译,因此 javascript 助手将无法找到该文件。

为了解决这个问题,您可以通过修改以下配置将modernizr添加到预编译列表中production.rb

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

有关更多信息,请参阅Rails 指南

于 2014-02-11T01:36:13.057 回答
4

请务必通过运行以下命令在生产环境中预编译您的资产:

RAILS_ENV=production bundle exec rake assets:precompile

资产管道上的 Rails 指南可以为您提供更多详细信息:http: //guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

于 2013-08-06T19:32:28.777 回答
1

我有一个使用在 Heroku 上部署的 Rails 4 的新应用程序:

<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

我的 javascript application.(fingerprint).js 从 src 调用:assets/application.js

我认为您的问题来自于您的 production.rb,他们从另一个位置定义资产。

所以也许你可以将 Moderniz.js 添加到

config.assets.precompile = [' .js', ' .css', '*.css.erb']

在 config/production.rb

或者只是在你的 application.js 中需要 modernizr 脚本

//= 需要现代化

并将modernizr 脚本调用删除到您的布局中。

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>

你能检查一下你的 application.js 是从哪里提供给你的生产环境的吗?

于 2013-10-01T12:51:48.313 回答
-1

可能是因为此文件需要位于 /vendor/assets/javascript 而不是 /app/assets/javascript 中。Vendor 文件夹用于存放 JavaScript 库,App 文件夹用于存放您的代码。

比在布局中添加标签更好的解决方案是向 application.js 添加脚本引用,并让 sass 编译器压缩并将其附加到主 javascript 文件中。

如果您没有得到明确的答案,请查看: http: //guides.rubyonrails.org/asset_pipeline.html#asset-organization

于 2013-08-06T18:47:58.057 回答