Rails 4:运行 资产预编译后在生产模式下的应用程序出现资产未找到问题

Rails 4: run application in production mode after assets precompile gives assets not found issue

我正在使用 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 访问,这是导致主要问题的原因。

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

我认为您需要在 production.rb:

中启用回退到资产管道
config.assets.compile =true

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

Rails4 中的资产管道不会在没有摘要的情况下编译资产。默认是只编译消化的资产。此选项不执行任何操作:

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

您需要使用 rails 帮助程序来生成 application.js

的摘要路径
<%= stylesheet_link_tag "application" %>

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

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

@Swati,首先通过-

清理断言管道

耙 asset:clean 然后 运行

RAILS_ENV=生产耙assets:precompile

在此处引用此讨论 - 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 因素或任何其他 gem。这是 rails_serve_static_assets gem 的代码,它被 rails_12factor 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