处理rails应用程序中的rack_throttle异常

rom*_*man 2 ruby throttling ruby-on-rails http

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

Internal Server Error

undefined method `each' for "403 Forbidden (Rate Limit Exceeded)\n":String
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪

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'
Run Code Online (Sandbox Code Playgroud)

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

rom*_*man 8

最后我找到了解决方案

问题出在rack-throttle宝石上.响应体应该是一个字符串数组,所以为了解决这个问题,我只是重写了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
Run Code Online (Sandbox Code Playgroud)

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

  • 或使用这个机架管道分叉修复它:https://github.com/datagraph/rack-throttle/pull/6 (3认同)