【问题标题】:javascript_include_tag Rails 4 generating "/javascripts/" instead of "/assets" in productionjavascript_include_tag Rails 4 在生产中生成“/javascripts/”而不是“/assets”
【发布时间】: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 版本升级?

标签: ruby-on-rails asset-pipeline


【解决方案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/
    猜你喜欢
    • 2014-05-14
    • 2014-09-18
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多