Rails 4 添加了一个异常ActionDispatch::ParamsParser::ParseError异常,但由于它在中间件堆栈中,因此它似乎无法在正常的控制器环境中被拯救。在 json API 应用程序中,我想以标准错误格式响应。
这个要点展示了一种插入中间件来拦截和响应的策略。按照这种模式,我有:
应用程序.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)。
现在,在上面的中间件中添加的唯一更改是:
2) Photo update attributes with non-parseable json
Failure/Error: response.status.should eql(422)
expected: 422
got: 200
并且日志显示标准控制器操作正在执行并返回正常响应(尽管因为它没有收到任何参数,所以它没有更新任何东西)。
我的问题:
如何从 ParseError 中拯救并返回自定义响应。感觉就像我在正确的轨道上,但并不完全在那里。
我无法弄清楚为什么在引发和救援异常时,控制器操作仍会继续进行。
非常感谢帮助,--Kip