Rails 4增加了一个异常ActionDispatch :: ParamsParser :: ParseError异常,但由于它在中间件堆栈中出现,它不能在正常情况下获救控制器环境。在json API应用程序中,我想用标准错误格式进行响应。如何在Rails 4中从ActionDispatch :: ParamsParser :: ParseError救援
这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,我不能rescue_from)。
与唯一的变化我们在上面的中间件添加:
2) Photo update attributes with non-parseable json
Failure/Error: response.status.should eql(422)
expected: 422
got: 200
和日志显示正在执行的标准控制器动作并返回正常应答(尽管因为它没有收到任何参数它没有更新任何东西)。
我的问题:
如何从ParseError营救,并返回一个自定义的响应。感觉像我在正确的轨道上,但不是那里。
我不能解决为什么,当异常被提出和救出时,控制器动作仍在继续。
帮助非常感谢,--Kip
有没有其他一些中间件改变返回状态?你有没有用pry或其他方法进行调试? – phoet 2013-03-17 12:06:53