rescue_from NoMethodError

时间:2011-08-03 21:33:32

标签: ruby-on-rails

我的设置:Rails 3.0.9,Ruby 1.9.2

我在Heroku上遇到了这个Rack bug,处理了为非文件字段发送的内容类型。特别是我得到的错误是

NoMethodError (undefined method `rewind' for "blah":String):

“blah”是我传递的url param的值。我认为应该可以忽略这个错误做这样的事情

application_controller.rb

  rescue_from NoMethodError do |exception|
    logger.debug "\n\n==============Rack rewind error=======================\n\n"
  end

我如何只检查NoMethodError倒带方法?或者也许有办法覆盖这个Rack方法?

为了澄清,我无法控制调用rewind方法,这是在Rack本身处理的,因此我无法使用try或修复错误。

2 个答案:

答案 0 :(得分:3)

如果可能的话,我会去尝试解决这个错误。如果没有,我不认为Rails允许你从rescue_from内重新引发异常,但你可以调用默认的错误处理程序:

rescue_from NoMethodError do |exception|
  if exception.name == :rewind
    logger.debug "rewind error" 
  else
    rescue_action_without_handler(exception)
  end
end

答案 1 :(得分:0)

我遇到了同样的问题,用python编写的客户端应用程序需要将一个文件以及其他几个非文件参数上传到Rails后端。只有带有文件对象的参数才能正常工作,但是当python客户端发送字符串参数时,Rails会引发NoMethodError (undefined method 'rewind' for <String#F3433>):。我通过jdelStrother应用this patch解决了这个问题。它只需要评论以下内容:

# elsif !filename && content_type
#   body.rewind
# 
#   # Generic multipart cases, not coming from a form
#   data = {:type => content_type,
#           :name => name, :tempfile => body, :head => head}

并将其替换为:

else
    data = body
end

在模块parse_multipart中的方法Rack::Utils::Multipart中。只需将补丁代码添加到config / initializers目录中的ruby文件中。