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



我有一个带有的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可以连接到/assets/目录。

为什么javascript_include_tag在生产中链接到/javascripts而不是/assets,我如何修复它?

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'
  }

一个新的Rails4应用程序在config/environments/production.rb 中有这个功能

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false

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

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

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

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

有关更多信息,请参阅Rails Guides

请确保通过运行以下命令预编译生产中的资产:

RAILS_ENV=production bundle exec rake assets:precompile

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

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

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

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

我认为你的问题来自于你的产品中的某些东西。rb从另一个地方定义资产。

因此,也许您可以将Moderniz.js添加到中

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

配置/生产.rb

或者只需在您的应用程序中使用modernizr脚本.js

//=需要媒染剂

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

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

你能检查一下你的application.js在生产环境中的位置吗?

这可能是因为该文件需要位于/vvendor/assets/javascript中,而不是/app/assets/javascript。Vendor文件夹用于javascript库,App文件夹用于您的代码。

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

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

相关内容

最新更新