Rails 4 добавляет исключение ActionDispatch:: ParamsParser:: ParseError, но, поскольку он находится в стеке промежуточного программного обеспечения, он не может быть спасен в среде обычного контроллера. В json API-приложении я хочу отвечать стандартным форматом ошибок.
В этом gist показана стратегия вставки промежуточного программного обеспечения для перехвата и ответа. Следуя этой схеме, я:
application.rb:
module Traphos
class Application < Rails::Application
....
config.middleware.insert_before ActionDispatch::ParamsParser, "JSONParseError"
end
end
И промежуточное ПО:
class JSONParseError
def initialize(app)
@app = app
end
def call(env)
begin
@app.call(env)
rescue ActionDispatch::ParamsParser::ParseError => e
[422, {}, ['Parse Error']]
end
end
end
Если я запускаю свой тест без промежуточного ПО, я получаю (spec):
Failures:
1) Photo update attributes with non-parseable json
Failure/Error: patch update_url, {:description => description}, "CONTENT_TYPE" => content_type, "HTTP_ACCEPT" => accepts, "HTTP_AUTHORIZATION" => @auth
ActionDispatch::ParamsParser::ParseError:
399: unexpected token at 'description=Test+New+Description]'
Это именно то, чего я ожидал бы (ParseError, что я не могу спасти_из).
Теперь с единственным изменением для добавления промежуточного программного обеспечения выше:
2) Photo update attributes with non-parseable json
Failure/Error: response.status.should eql(422)
expected: 422
got: 200
И журнал показывает, что выполняется действие стандартного контроллера и возвращает нормальный ответ (хотя, поскольку он не получил никаких параметров, он ничего не обновлял).
Мои вопросы:
-
Как можно спасти от ParseError и вернуть настраиваемый ответ. Похоже, я на правильном пути, но не совсем там.
-
Я не могу понять, почему, когда исключение создано и спасено, действие контроллера продолжается.
Помогите оценить, --Kip