Ruby on rails 4 Rails 4:在资产预编译导致资产未找到问题后,以生产模式运行应用程序

Ruby on rails 4 Rails 4:在资产预编译导致资产未找到问题后,以生产模式运行应用程序,ruby-on-rails-4,asset-pipeline,production-environment,ruby-on-rails-4.1,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.ass

我使用的是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\u ENV=production rake assets:precompile
之后,它将预编译所有资产,并将它们存储在文件名为
application-ca4ad5e05e0582927b0a78c2b6feef3309b.js的公共/资产文件夹中

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

ActionController::RoutingError (No route matches [GET] "/assets/application.js"):
我尝试更改config.service\u static\u资产和其他资产的值。。但仍然面临同样的问题

预编译文件以其名称中的摘要值保存,例如:
application-ca4ad5e0582927b0a78c2b6feef3309b.js
,但作为
application.js
访问,这是主要问题的根源


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

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

config.assets.compile =true

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

Rails 4中的资产管道在编译资产时不会没有摘要。默认情况下,只编译摘要资产。此选项不起任何作用:

config.assets.digest = false  # Will not compile undigested assets
您需要使用rails助手生成
application.js的摘要路径

<%= stylesheet_link_tag "application" %>

如果这不是一种选择,您可以使用多种策略中的一种来生成非消化资产:


关于sprocket rails项目,有很多讨论和解决方法。

@Swati,首先通过-

耙资源:清理然后运行


RAILS\u ENV=生产rake资产:预编译 这正是我们面临的问题

添加12因子gem:修复了这个问题。(如果您在Heroku上运行Rails 4+,则现在需要此gem)。 我试着在你工作的同一份回购协议中添加gem'rails u factor',这会很好地加载所有资产

基本上,这个
rails_12factor
gem是两个gem的组合,即
rails\u服务于静态资产
rails\u标准资产
。Gem
rails\u service\u static\u assets
只是将此配置设置为true。这通常在config/environments/production.rb中

config.serve_static_assets = true
因此,一般来说,如果我们正在开发一个
Rails4
应用程序,并且我们部署在自己的服务器上(比如说一个专用服务器而不是heroku),那么将这个标志
config.service\u static\u assets
设置为true就足够了,我们不需要添加rails\u 12 factor或任何其他gems。以下是
rails\u service\u static\u assets
gem的代码,由
rails\u 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
模块RailserveStaticAssets
类Railtie=“4.2.0”
::Rails.configuration.service\u static\u files=true
其他的
::Rails.configuration.service\u static\u assets=true
结束
::Rails.configuration.action\u dispatch.x\u sendfile\u header=nil
结束
结束
结束

如上所述,Swati显然正在执行这些步骤。看起来问题不在于预编译。是的,问题不在于
precompile
,因为资产是用正确的摘要正确生成的。因此,上面的clean命令没有多大帮助。这个问题与链轮以及Rails 4在编译时如何管理资产摘要有更多的关系。顺便说一句,您在上面的命令中有一个输入错误,应该是
rake assets:clean
:)谢谢@Lukas Eklund,关于您在这里共享的链接的讨论真是太棒了,这让我们了解了Rails为什么会在资产哈希上做出这样的决定。不幸的是,我们尝试了您上面提到的所有4种解决方案,但均无效。最后,添加
gem'rails\u 12factor'
使它适合我们。似乎我们对资产404错误有不同的问题。当我们测试
生产模式时,我们不想在本地执行这个
config.assets.compile=true
。@Swati,我正在检查gem
rails\u 12factor
是如何解决这个问题的。在检查代码和文档之后。。。它所做的只是将gems
rails\u service\u static\u资产
rails\u stdout\u日志记录
结合起来。Gem
rails\u service\u static\u资产
允许rails服务器直接交付资产,而不是返回404。此gem通过简单地设置单个配置选项config.service\u static\u assets=true,在应用程序中实现此行为。通过使用rails\u serve\u static\u assets gem,您无需手动设置此配置。:-)而@Swati,如果我们不想使用所有这些gem,我们需要的修复就是这个
config.service\u static\u assets=true
。由于Rails4的更改,需要启用此配置。Gem
rails\u service\u static\u assets
为我们启用该标志(如果我们使用它)。否则,由于Rails4的更改,这只是一个配置问题。