我已经在Heroku Cedar Stack上运行了Rails 3.1应用程序几个月了。我正在使用Rack :: Deflater中间件来gzip我的内容,并通过
来实现config.middleware.insert_before ActionDispatch::Static, Rack::Deflater
在我的staging.rb文件中。
但是,从上周开始,部署到Heroku时出现以下错误
Running: rake assets:precompile
rake aborted!
No such middleware to insert before: ActionDispatch::Static
但是,运行rake中间件仍会返回
use Rack::Cache
use Rack::Deflater
use ActionDispatch::Static
use Rack::Lock
服务的内容仍然是gzip压缩。但是,由于预编译失败,资产未编译(缩小)。手动rake预编译:: asets也无济于事。
所以,我假设在预编译资产期间ActionDispatch :: Static不可用。所以我尝试在Rack :: Lock之前插入Rack :: Deflater,现在我的资产编译时没有任何错误消息,但是服务的内容不是gzip压缩。
那么,我需要做什么,gzip和编译我的资产?我错过了什么?感谢。
答案 0 :(得分:5)
只需抬头Rack::Deflater
is already used by Rails 3.1,这样您就不需要手动执行此操作。
但是,为了在这里回答您的问题,我认为您的production.rb
设置了config.serve_static_assets = false
。
仅在ActionDispatch::Static
设置为serve_static_assets
时才使用true
中间件。 Heroku实际上会注入此配置来覆盖您设置的任何内容(部署时请参阅Injecting rails3_serve_static_assets
日志消息),但我不确定部署发生的阶段。
因此,当assets:precompile
运行时,你可能没有启用静态资产服务(注意这只是一个猜测,我还没有在Rails 3.1上,所以我可能是错的)
我建议不要让membLoper建议在你的机架文件中手动添加它:
application.rb
答案 1 :(得分:3)
我仍然不明白为什么Heroku在预编译资产时无法识别ActionDispatch :: Static。然而,Heroku人确实建议解决这个问题。
Rack :: Deflater中间件需要插入config.ru文件而不是环境文件。像,
require ::File.expand_path('../config/environment', __FILE__)
# Middleware to gzip content
use Rack::Deflater
run MyApplication
这样,它不会干扰资源预编译,并且仍会对正在提供的内容进行gzip压缩。
有关config.ru如何工作以及Rack :: Deflater现在所在的任何资源都非常受欢迎。