【问题标题】:Rails 4: run application in production mode after assets precompile gives assets not found issueRails 4:在资产预编译给出资产未找到问题后以生产模式运行应用程序
【发布时间】:2015-07-22 07:38:21
【问题描述】:

我正在使用 rails 4.1.8

在 production.rb 文件中我有以下内容:

  config.eager_load = false
  config.cache_classes = false
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = true
  config.serve_static_assets = true
  config.assets.js_compressor = :uglifier
  config.assets.compile = false
  config.assets.digest = false
  config.assets.debug = true

现在在运行 RAILS_ENV=production rake assets:precompile 后,它会预编译所有资产并将它们存储在 public/assets 文件夹中,文件名为 application-ca4ad5e0582927b0a78c2b6feef3309b.js

在本地的生产环境中运行应用程序后,它会抛出错误

ActionController::RoutingError (No route matches [GET] "/assets/application.js"):

我尝试更改 config.serve_static_assets 和其他的值。但仍然面临同样的问题。

预编译文件在其名称中使用摘要值保存,例如:application-ca4ad5e0582927b0a78c2b6feef3309b.js 但以application.js 访问,这是导致主要问题的原因。

这里有什么建议吗?谢谢..

【问题讨论】:

    标签: ruby-on-rails-4 asset-pipeline production-environment ruby-on-rails-4.1


    【解决方案1】:

    在此处参考此讨论 - Most of my assets suddenly return 404 after a push to heroku 这正是我们面临的问题。

    添加 12 因子 gem:github.com/heroku/rails_12factor 修复了这个问题。 (如果您在 Heroku 上运行 Rails 4+,则现在需要此 gem)。 我尝试在您正在工作的同一个仓库中添加 gem 'rails_12factor' ,这可以很好地加载所有资产。

    基本上,这个rails_12factor gem 是 2 个 gem 的组合,即。 rails_serve_static_assetsrails_stdout_logging。 Gem rails_serve_static_assets 只是将此配置设置为 true。这通常在您的 config/environments/production.rb 中

    config.serve_static_assets = true
    

    所以一般来说,如果我们正在开发一个 Rails4 应用程序并且我们部署在我们自己的服务器上(比如专用服务器而不是 heroku),那么将此标志 config.serve_static_assets 设置为 true 就足够了,我们不需要添加 rails_12 因子或任何其他宝石。这是rails_12factor gem 使用的rails_serve_static_assets gem 的代码。

    module RailsServeStaticAssets
      class Railtie < Rails::Railtie
        config.before_initialize do
          if Rails.version >= "4.2.0"
            ::Rails.configuration.serve_static_files = true
          else
            ::Rails.configuration.serve_static_assets = true
          end
          ::Rails.configuration.action_dispatch.x_sendfile_header = nil
        end
      end
    end
    

    【讨论】:

    • @Swati,我正在检查 gem rails_12factor 是如何解决这个问题的。在检查了代码和他们的文档之后……它所做的就是结合 gems rails_serve_static_assetsrails_stdout_logging。 Gem rails_serve_static_assets 使 Rails 服务器能够直接交付资产,而不是返回 404。这个 gem 通过简单地设置单个配置选项 config.serve_static_assets = true 在应用程序中实现此行为。通过使用 rails_serve_static_assets gem,您无需手动设置此配置。 :-)
    • 还有@Swati,如果我们不想使用所有这些宝石,我们需要的修复是config.serve_static_assets = true。由于 Rails4 的更改,需要启用此配置。如果我们使用它,Gem rails_serve_static_assets 会为我们启用该标志。否则,这只是 Rails4 更改导致的配置问题。
    【解决方案2】:

    Rails 4 中的资产管道不会编译没有摘要的资产。默认情况下仅编译摘要资产。这个选项什么都不做:

    config.assets.digest = false  # Will not compile undigested assets
    

    您需要使用 rails 助手来生成application.js 的摘要路径

    <%= stylesheet_link_tag "application" %>
    

    如果这不是一个选项,您可以使用各种策略之一来生成未消化的资产:

    sprocket-rails 项目上的This github issue 有很多讨论和解决方法。

    【讨论】:

    • 感谢@Lukas Eklund,确实对您在此处分享的链接进行了精彩的讨论 - link,这让我们了解了 Rails 为何对资产哈希做出决定。不幸的是,我们尝试了您上面提到的所有 4 种解决方案,但都没有帮助。最后添加gem 'rails_12factor' 使它对我们有用。似乎我们对资产 404 错误有不同的问题。我们不想在测试production 模式时在本地执行此config.assets.compile =true
    【解决方案3】:

    我认为您需要在 production.rb 中启用回退到资产管道:

    config.assets.compile =true
    

    这意味着您正在动态编译(本地供您测试),但是当您部署到生产时删除此行或将其设置为 false。

    【讨论】:

      【解决方案4】:

      @Swati,首先清理断言管道-

      rake assets:clean 然后运行

      RAILS_ENV=生产 rake 资产:预编译

      【讨论】:

      • 正如斯瓦蒂在上面提到的那样,很明显她正在执行这些步骤。看起来问题出在预编译上。
      • 是的,precompile 不是问题,因为资产通过正确的摘要正确生成。因此,上面的 clean 命令没有多大帮助。这个问题更多地与 sprockets 以及 Rails 4 在编译时如何管理资产摘要有关。顺便说一句,您在上面的命令中有错字,应该是rake assets:clean :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      相关资源
      最近更新 更多