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

Stu*_*art 32 ruby-on-rails asset-pipeline

我有一个Rails 4应用程序

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>
Run Code Online (Sandbox Code Playgroud)

在头上.在开发中,将呈现以下HTML,并加载modernizr:

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>
Run Code Online (Sandbox Code Playgroud)

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

<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script>
Run Code Online (Sandbox Code Playgroud)

在生产中,/assets/modernizr.js被发现并可浏览.

Rails文档说,javascript_include_tag应该产生

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>
Run Code Online (Sandbox Code Playgroud)

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

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

mob*_*ent 21

AssetUrlHelper的一个用法语句表明它将生成/ javascripts/url,就像你看到的那样:

#asset_path"application",输入:: javascript#=> /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'
  }
Run Code Online (Sandbox Code Playgroud)

一个新的Rails 4应用程序在config/environments/production.rb中有这个

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false
Run Code Online (Sandbox Code Playgroud)

这似乎符合你所看到的行为.

  • 谢谢!有些js/css文件没有预编译,导致它无法与application.js/css文件关联,因此rails 4资源预编译无法找到那些文件.您可以将文件添加到预编译文件列表中,因为这是`#config/environments/production.rb config.assets.precompile + = [Proc.new {| path | File.basename(path)=〜/^ [^_].*\.\ w + $ /}]` (4认同)
  • Rails似乎对资产管道有一些非常糟糕的默认值. (4认同)

pat*_*was 12

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

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

config.assets.precompile += ['modernizr.js']
Run Code Online (Sandbox Code Playgroud)

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