处理rails应用程序中的rack_throttleexception

当速率限制超出时,我如何处理由rack-throttle gem产生的错误? 现在我得到一个包含以下内容的回复:

Internal Server Error undefined method `each' for "403 Forbidden (Rate Limit Exceeded)\n":String 

这是堆栈跟踪

 ERROR NoMethodError: undefined method `each' for "403 Forbidden (Rate Limit Exceeded)\n":String /home/rkapitonov/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.1/lib/active_record/query_cache.rb:45:in `each' /home/rkapitonov/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:458:in `each' /home/rkapitonov/.rvm/gems/ruby-1.9.2-p290/gems/rack-1.3.6/lib/rack/body_proxy.rb:23:in `method_missing' /home/rkapitonov/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.1/lib/rails/rack/content_length.rb:26:in `call' /home/rkapitonov/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.1/lib/rails/rack/log_tailer.rb:14:in `call' /home/rkapitonov/.rvm/gems/ruby-1.9.2-p290/gems/rack-1.3.6/lib/rack/handler/webrick.rb:59:in `service' /home/rkapitonov/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service' /home/rkapitonov/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run' /home/rkapitonov/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread' 

如何处理此错误并呈现一些自定义文件或进行重定向?

最后我找到了解决方案

问题出在rack-throttlegem上。 响应体应该是一个字符串数组,所以为了解决这个问题,我只是重写了http_error方法,这对我来说http_error 。 你应该把http_status(code) + (message.nil? ? "\n" : " (#{message})\n")一个数组,所以只需把它放在方括号中。

 class Rack::Throttle::Limiter def http_error(code, message = nil, headers = {}) [code, {'Content-Type' => 'text/plain; charset=utf-8'}.merge(headers), [http_status(code) + (message.nil? ? "\n" : " (#{message})\n")]] end end 

把它放在config/initializers/rack_throttle.rb 。 文件名可以更改为您喜欢的任何名称。

您需要创建一个Rack :: Middleware来检查机架式油门是否超出限制并执行您想要的操作。

或者你可以覆盖方法Rack::Throttle::Limiter#rate_limit_exceeded来做你真正想要的事情: https : //github.com/datagraph/rack-throttle/blob/master/lib/rack/throttle/limiter.rb# L177

您也可以在Rack :: Trottle middelware中传递一些选项:

https://github.com/datagraph/rack-throttle/blob/master/lib/rack/throttle/limiter.rb#L19