【发布时间】:2013-03-05 17:53:57
【问题描述】:
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
如果我在没有中间件的情况下运行测试,我会得到(规范):
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 that I can't rescue_from)。
现在只需在上面的中间件中添加更改:
2) Photo update attributes with non-parseable json
Failure/Error: response.status.should eql(422)
expected: 422
got: 200
并且日志显示标准控制器操作正在执行并返回正常响应(尽管因为它没有收到任何参数,所以它没有更新任何东西)。
我的问题:
如何从 ParseError 中拯救并返回自定义响应。感觉我在正确的轨道上,但并不完全在那里。
我无法弄清楚为什么在引发并救援异常时,控制器操作仍会继续进行。
非常感谢您的帮助,--Kip
【问题讨论】:
-
是否有其他中间件可以改变返回状态?你有没有用 pry 或其他东西进行调试?
标签: ruby-on-rails ruby exception params rescue