我在Rails 2.3.5上.在典型的用户控制器中创建操作
class UsersController def create @user = User.new(params[:user]) respond_to do |format] if @user.save ... else format.json .... end end end
当客户端传递无效/格式错误的JSON字符串以进行输入时,Rails会抛出500内部服务器错误,指出“无效的JSON字符串”.我可以捕获错误,以便我可以给出自定义消息吗?
更新这里是请求的堆栈跟踪.就这样我很清楚,我知道这是一个格式错误的JSON字符串,我的问题不是如何修复JSON字符串而是如何捕获此特定错误,以便我可以发送回比HTTP 500内部服务器错误更有意义的错误消息.在此先感谢您的帮助
Error occurred while parsing request parameters. Contents: user: {login: "John",email: "john@yahoo.com",password: "111"}} /!\ FAILSAFE /!\ Mon Nov 08 02:01:04 -0800 2010 Status: 500 Internal Server Error Invalid JSON string c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/json/backends/yaml.rb:14:in `decode' c:1:in `__send__' c:1:in `decode' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/params_parser.rb:42:in `parse_formatted_parameters' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/params_parser.rb:11:in `call' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/session/cookie_store.rb:93:in `call' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/failsafe.rb:26:in `call' c:/ruby/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `call' c:/ruby/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `synchronize' c:/ruby/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `call' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:114:in `call' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/reloader.rb:34:in `run' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:108:in `call' c:/ruby/lib/ruby/gems/1.8/gems/rails-2.3.5/lib/rails/rack/static.rb:31:in `call' c:/ruby/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/urlmap.rb:46:in `call' c:/ruby/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/urlmap.rb:40:in `each' c:/ruby/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/urlmap.rb:40:in `call' c:/ruby/lib/ruby/gems/1.8/gems/rails-2.3.5/lib/rails/rack/log_tailer.rb:17:in `call' ... c:/ruby/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/handler/mongrel.rb:34:in `run' c:/ruby/lib/ruby/gems/1.8/gems/rails-2.3.5/lib/commands/server.rb:111 c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' script/server:3 re.rb:31:in `require' script/server:3
解决方法
我发现这个rails插件可以在rails 3.0.5:
https://github.com/kares/request_exception_handler上运行
正如Rob Cameron建议它加载你的rails应用程序并从你的应用程序代码中引发parseError.我没有测试它的性能影响,但它似乎确实运行良好.