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

问题描述 投票:2回答:4

我正在使用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它预先编译所有资产,并将它们与文件名application-ca4ad5e0582927b0a78c2b6feef3309b.js一起存储在public / assets文件夹中

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

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
4个回答
4
投票

请参阅此处的讨论 - 在推送到heroku之后,我的大多数资产突然返回404这是我们面临的确切问题。

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

基本上这个rails_12factor宝石是rails_12factor宝石的组合即。 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_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

3
投票

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

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

您需要使用rails helper来生成application.js的消化路径

<%= stylesheet_link_tag "application" %>

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

sprocket-rails项目中的这个github问题有很多讨论和解决方法。


1
投票

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

config.assets.compile =true

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


0
投票

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

rake资产:清理然后运行

RAILS_ENV =生产佣金资产:预编译

© www.soinside.com 2019 - 2024. All rights reserved.