Rails 4 добавляет исключение ActionDispatch::ParamsParser::ParseError, но, поскольку оно находится в стеке промежуточного программного обеспечения, оно не может быть спасено в обычной среде контроллера. В приложении json API я хочу ответить стандартным форматом ошибки.
Этот суть показывает стратегию вставки промежуточного программного обеспечения для перехвата и ответа. По этому шаблону у меня есть:
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
Если я запускаю свой тест без промежуточного программного обеспечения, я получаю (спецификация):
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, от которого я не могу save_from).
Теперь с единственным изменением, которое нужно добавить в промежуточное программное обеспечение выше:
2) Photo update attributes with non-parseable json
Failure/Error: response.status.should eql(422)
expected: 422
got: 200
И журнал показывает, что стандартное действие контроллера выполняется и возвращает нормальный ответ (хотя, поскольку он не получил никаких параметров, он ничего не обновлял).
Мои вопросы:
Как спастись от ParseError и вернуть собственный ответ. Кажется, я на правильном пути, но не совсем там.
Я не могу понять, почему, когда возникает и спасается исключение, действие контроллера все еще продолжается.
Помощь очень ценится, --Кип