rescue_from NoMethodError - PullRequest
       4

rescue_from NoMethodError

1 голос
/ 04 августа 2011

Мои настройки: Rails 3.0.9, Ruby 1.9.2

Я столкнулся с этой ошибкой Rack в Heroku, касающейся типа содержимого, отправляемого для не файловых полей.В частности, ошибка, которую я получаю:

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

"бла" - это значение параметра URL, который я передаю.Я думаю, что можно было бы игнорировать эту ошибку, делая что-то вроде этого

application_controller.rb

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

Как проверить только метод перемотки NoMethodError?Или, возможно, есть способ переопределить этот метод Rack?

Просто чтобы уточнить, я не могу контролировать вызов метода перемотки, это обрабатывается в самом Rack, поэтому я не могу использовать try или исправить ошибку..

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Я бы пошел и попытался исправить эту ошибку, если это вообще возможно. Если нет, я не думаю, что Rails позволяет повторно вызвать исключение из rescue_from, но вместо этого вы можете вызвать обработчик ошибок по умолчанию:

rescue_from NoMethodError do |exception|
  if exception.name == :rewind
    logger.debug "rewind error" 
  else
    rescue_action_without_handler(exception)
  end
end
0 голосов
/ 03 сентября 2011

У меня была такая же проблема, клиентское приложение, написанное на python, должно было загрузить файл вместе с парой других не-файловых параметров в серверную часть Rails.Только параметры с файловым объектом работали нормально, но Rails поднял NoMethodError (undefined method 'rewind' for <String#F3433>):, когда клиент Python отправлял строковые параметры.Я решил это, применив этот патч от jdelStrother.Просто нужно прокомментировать следующее:

# 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.просто добавьте код патча в файл ruby ​​в каталоге config / initializers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...