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

Posted

技术标签:

【中文标题】javascript_include_tag Rails 4 在生产中生成“/javascripts/”而不是“/assets”【英文标题】:javascript_include_tag Rails 4 generating "/javascripts/" instead of "/assets" in production 【发布时间】:2013-07-11 11:09:44 【问题描述】:

我有一个带有

的 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_tags 很好,链接到/assets/ 目录。

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

【问题讨论】:

您找到解决方案了吗?我遇到了完全相同的问题,但这里的答案都没有帮助。 在生产中,你应该有一个像/assets/light-0cd9377b97b67182b68c8023bd6c2fbe.css这样的指纹资产URL 这是干净的 Rails 4 应用还是从早期 Rails 版本升级? 【参考方案1】:

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

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

(来自 assets_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

这似乎与您看到的行为相符。

【讨论】:

谢谢!一些 js/css 文件没有预编译,因为它不能与 application.js/css 文件关联,所以 rails 4 assets precompile 找不到这些文件。您可以将文件添加到预编译文件列表中,如下#config/environments/production.rb config.assets.precompile += [ Proc.new |path| File.basename(path) =~ /^[^_].*\.\w+$/ ] Rails 的资产管道似乎有一些非常糟糕的默认值。【参考方案2】:

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

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

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

欲了解更多信息,请参阅the Rails Guides

【讨论】:

这个答案是正确的。在 prod 中,如果 javascript_include_tag 在搜索路径中找不到预编译的 javascript 资产(我认为是 ./public/assets/ ),它将生成以 /javascripts/ 开头的 src(Rails 认为您会将这些资产放在 ./public/javascripts/ )。在 dev 中,config.assets.compile 设置为 true,所以如果 javascript_include_tag 找不到 ./public/assets 中的资产,rails 会编译资产,然后它会找到它。在生产中,config.assets.compilefalse。因此,请使用config.assets.precompile 确保您的资产已预编译。【参考方案3】:

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

RAILS_ENV=production bundle exec rake assets:precompile

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

【讨论】:

但这只会将资产编译到public/assets/ 文件夹中 - 它不能解释为什么路径生成不正确。 您是否更改了production.rb 中的路径?它看起来像 config.assets.prefix = "/some_other_path" guides.rubyonrails.org/… 不,我没有。我在vendor/ 中的所有资产都正确编译到/assets 中,并且路径是正确的。只是/app/assets 中的javascripts 出于某种原因有javascript_include_tag 生成的错误路径。是的,我将它们添加到precompile。真是奇怪的行为......【参考方案4】:

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

<%= 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 是从哪里提供给您的生产环境的吗?

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

/vendor/assets/javascript//app/assets/javascript/ 文件夹中的文件被编译到public/assets/ 文件夹中,生成的manifest.json 文件描述了查找指纹文件的逻辑路径。但是,要使其正常工作,javascript_include_tag 生成的路径仍需要指向 assets/

以上是关于javascript_include_tag Rails 4 在生产中生成“/javascripts/”而不是“/assets”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 1.9.1 而不是 jquery 1.4

数字证书注册审批机构(RA)

latex 中 \ra 是啥意思 ?

如何在 Xcode 中播放 RealAudio (.RA) 文件(远程或本地)?

1084

RA-SaaS项目已延迟,并将继续延迟...