Я сейчас сталкиваюсь с той же проблемой - у меня есть API, которому кто-то может передать недопустимый JSON, и я хочу быть осторожным с ошибкой, которую я возвращаю. Я использую Rails 3.0.5. Я проследил ошибку, выводимую в lib/active_support/json/backends/yaml.rb
строку 17:
def decode(json)
if json.respond_to?(:read)
json = json.read
end
YAML.load(convert_json_to_yaml(json))
rescue ArgumentError
raise ParseError, "Invalid JSON string"
end
Итак, json.read
дает сбой и выдает ошибку. К сожалению, это происходит задолго до того, как ваш контроллер когда-либо вызывается (это часть первоначального разбора параметров запроса, когда Rails связывается с Rack). Я бы подумал, что для того, чтобы поймать это, вам нужно будет добавить немного обезьяньего исправления, чтобы перезаписать некоторые встроенные ошибки и вместо этого всплыть что-то, что вы можете использовать ... возможно, вы могли бы добавить заголовок к объекту запроса что вы можете обнаружить в контроллере и выдать свою собственную ошибку.
К сожалению, я не думаю, что это будет работать для меня, так как я хочу изменить поведение только при доступе к API, а не к остальной части сайта. Хотя я предполагаю, что в monkey-patch, предполагая, что у меня есть доступ к объекту запроса, я мог бы сказать ему, чтобы он использовал мое новое поведение только в том случае, если запрошенный путь соответствует регулярному выражению типа /\/api\//