javascript_include_tag Rails 4生成" / javascripts /"而不是" / assets"在生产中

时间:2013-07-12 19:43:57

标签: ruby-on-rails asset-pipeline

我有一个带有

的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,我该如何解决?

5 个答案:

答案 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.jsapplication.css以及它在资源路径中找到的所有图像。因此,在生产中,mordernizr将不会被预编译,因此javascript助手将无法找到该文件。

为了解决此问题,您可以通过修改production.rb

中的以下配置,将modernizr添加到预编译列表中
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