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

时间:2015-05-11 17:17:07

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

我正在使用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的公共/资产文件夹

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

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

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

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

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

4 个答案:

答案 0 :(得分:4)

请在此处参阅此讨论 - 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宝石是两颗宝石的组合。 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就足够了,我们不会#39;需要添加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

答案 1 :(得分:3)

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

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

您需要使用rails helper来生成application.js

的消化路径
<%= stylesheet_link_tag "application" %>

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

sprocket-rails项目的

This github issue有很多讨论和解决方法。

答案 2 :(得分:1)

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

config.assets.compile =true

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

答案 3 :(得分:0)

@Swati,首先通过 -

清理断言管道

rake asset:clean 然后运行

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