- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
每当针对我的仅限 API 的 Rails 5.x 应用程序发送格式错误的 JSON 时,我都会收到一个异常,Rails 将整个堆栈跟踪作为 JSON 返回。显然,我想用一个很好的、自定义的、格式化的错误来回应。
=> Booting Puma
=> Rails 5.0.0.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.6.0 (ruby 2.3.0-p0), codename: Sleepy Sunday Serenity
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
Started POST "/api/v1/identities/" for ::1 at 2016-10-26 18:42:32 +0200
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations".* FROM "schema_migrations"
Error occurred while parsing request parameters.
Contents:
{
"whatever": "ewewgewewtwe"
"malformed_json": ";
}
ActionDispatch::ParamsParser::ParseError (822: unexpected token at '{
"whatever": "ewewgewewtwe"
"malformed_json": ";
}'):
actionpack (5.0.0.1) lib/action_dispatch/http/parameters.rb:71:in `rescue in parse_formatted_parameters'
actionpack (5.0.0.1) lib/action_dispatch/http/parameters.rb:65:in `parse_formatted_parameters'
actionpack (5.0.0.1) lib/action_dispatch/http/request.rb:366:in `block in POST'
rack (2.0.1) lib/rack/request.rb:57:in `fetch'
rack (2.0.1) lib/rack/request.rb:57:in `fetch_header'
actionpack (5.0.0.1) lib/action_dispatch/http/request.rb:365:in `POST'
actionpack (5.0.0.1) lib/action_controller/metal/params_wrapper.rb:282:in `_wrapper_enabled?'
actionpack (5.0.0.1) lib/action_controller/metal/params_wrapper.rb:231:in `process_action'
activerecord (5.0.0.1) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (5.0.0.1) lib/abstract_controller/base.rb:126:in `process'
actionpack (5.0.0.1) lib/action_controller/metal.rb:190:in `dispatch'
actionpack (5.0.0.1) lib/action_controller/metal.rb:262:in `dispatch'
actionpack (5.0.0.1) lib/action_dispatch/routing/route_set.rb:50:in `dispatch'
actionpack (5.0.0.1) lib/action_dispatch/routing/route_set.rb:32:in `serve'
actionpack (5.0.0.1) lib/action_dispatch/journey/router.rb:39:in `block in serve'
actionpack (5.0.0.1) lib/action_dispatch/journey/router.rb:26:in `each'
actionpack (5.0.0.1) lib/action_dispatch/journey/router.rb:26:in `serve'
actionpack (5.0.0.1) lib/action_dispatch/routing/route_set.rb:725:in `call'
rack (2.0.1) lib/rack/etag.rb:25:in `call'
rack (2.0.1) lib/rack/conditional_get.rb:38:in `call'
rack (2.0.1) lib/rack/head.rb:12:in `call'
activerecord (5.0.0.1) lib/active_record/migration.rb:552:in `call'
actionpack (5.0.0.1) lib/action_dispatch/middleware/callbacks.rb:38:in `block in call'
activesupport (5.0.0.1) lib/active_support/callbacks.rb:97:in `__run_callbacks__'
activesupport (5.0.0.1) lib/active_support/callbacks.rb:750:in `_run_call_callbacks'
activesupport (5.0.0.1) lib/active_support/callbacks.rb:90:in `run_callbacks'
actionpack (5.0.0.1) lib/action_dispatch/middleware/callbacks.rb:36:in `call'
actionpack (5.0.0.1) lib/action_dispatch/middleware/executor.rb:12:in `call'
actionpack (5.0.0.1) lib/action_dispatch/middleware/remote_ip.rb:79:in `call'
actionpack (5.0.0.1) lib/action_dispatch/middleware/debug_exceptions.rb:49:in `call'
actionpack (5.0.0.1) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
railties (5.0.0.1) lib/rails/rack/logger.rb:36:in `call_app'
railties (5.0.0.1) lib/rails/rack/logger.rb:24:in `block in call'
activesupport (5.0.0.1) lib/active_support/tagged_logging.rb:70:in `block in tagged'
activesupport (5.0.0.1) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (5.0.0.1) lib/active_support/tagged_logging.rb:70:in `tagged'
railties (5.0.0.1) lib/rails/rack/logger.rb:24:in `call'
actionpack (5.0.0.1) lib/action_dispatch/middleware/request_id.rb:24:in `call'
rack (2.0.1) lib/rack/runtime.rb:22:in `call'
activesupport (5.0.0.1) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
actionpack (5.0.0.1) lib/action_dispatch/middleware/executor.rb:12:in `call'
actionpack (5.0.0.1) lib/action_dispatch/middleware/static.rb:136:in `call'
rack (2.0.1) lib/rack/sendfile.rb:111:in `call'
railties (5.0.0.1) lib/rails/engine.rb:522:in `call'
puma (3.6.0) lib/puma/configuration.rb:225:in `call'
puma (3.6.0) lib/puma/server.rb:578:in `handle_request'
puma (3.6.0) lib/puma/server.rb:415:in `process_client'
puma (3.6.0) lib/puma/server.rb:275:in `block in run'
puma (3.6.0) lib/puma/thread_pool.rb:116:in `block in spawn_thread'
# in config/application.rb
config.middleware.insert_before(ActionDispatch::ParamsError,'BadRequestError')
# middleware
class BadRequestError
def initialize(app)
@app = app
end
def call(env)
begin
@app.call(env)
rescue ActionDispatch::ParamsParser::ParseError
Api::ApiController.action(:raise_bad_request).call(env)
end
end
end
ActionDispatch::ParamsError
已从 Rails 5 中删除;
raise_bad_request
以某种方式从未调用过 Action 。
最佳答案
更新了使用 Rails 5.1 和更新版本的答案。 (感谢@Edwin Meyer)config.middlware.use
现在需要一个类,而不是一个字符串。
我现在还提到,我已将中间件放在 app/middleware
下。 .所以没必要要求。
我遇到了同样的问题,在我的情况下很容易解决。
只需在 application.rb
中使用:
config.middleware.use CatchJsonParseErrors
# Instead of
# config.middleware.insert_before ActionDispatch::ParamsParser, "CatchJsonParseErrors"
# I used in my Rails 4 app
# app/middleware/catch_json_parse_errors.rb
class CatchJsonParseErrors
def initialize(app)
@app = app
end
def call(env)
begin
@app.call(env)
rescue ActionDispatch::ParamsParser::ParseError => error
if env['HTTP_ACCEPT'] =~ /application\/json/
error_output = "There was a problem in the JSON you submitted: #{error}"
return [
400, { "Content-Type" => "application/json" },
[ { status: 400, error: error_output }.to_json ]
]
else
raise error
end
end
end
end
{"status":400,"error":"There was a problem in the JSON you submitted: 743: unexpected token at '{ \"foo\": \"bar\" '"}
ACCEPT
标题。
关于ruby-on-rails - 如何在 Rails 5 中拯救 ActionDispatch::ParamsParser::ParseError 并返回自定义 API 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268101/
我对基本的 Rails 概念(如 ActiveRecord、路由、迁移等)有相当不错的掌握。我很难理解的一件事是 ActionDispatch。我找不到关于它是什么的简单英语描述(或任何描述)。那是什
我有一个与后端 Rails API 交互的前端 React SPA。在生产中,前端有一个域名 mysecretsite.com,而后端与 mysecretsite.io 相关联 我正在使用 Actio
当我上传文件并请求以下参数时: params[:product][:images_attributes]["0"][:image] 它返回: #> 我用来获取 filename 的 ruby 代码
无论我在我的应用程序中遇到什么错误,我都无法在我的日志中看到错误,我得到以下信息关于我面临的所有错误的消息,所以我无法解决我的错误,有人能帮我解决这个问题吗?? Completed 500 Inter
有没有办法将字符串转换成ActionDispatch::Http::UploadedFile 我需要它能够在 API 请求中传递文件路径以处理将 excel 插入数据库,因为我想使用 rest API
我有 Ruby on Rails 3 的东西 我试试这个简单的代码 def index flash[:notice] = "ok" respond_to do |format|
我试图了解 Rails 如何在 /public 下提供静态文件,如果我理解正确,ActionDispatch::Static 中间件负责此操作。 但是,我注意到它只在开发环境中可用: $ rake m
我正在做一些条纹集成测试,我想 stub /模拟一些端点。我正在尝试这样做: Stripe::Charge.stubs(:retrieve).returns({:balance_transaction
NoMethodError:ActionDispatch::Request:Class 的未定义方法“alias_method_chain” 我在安装 wiselinks gem 后遇到这个问题。 R
我目前正在开发一个 ruby on rails 项目。在项目中我有一个输入文件类型(图像)的表单,我需要将图像转换为base64(项目连接到外部api,所以图像需要在base64中) 到目前为止,
我有一个 Rails 应用程序,我正在解析上传的 CSV。我刚刚发现解析已停止工作并正在调查。 我已经追溯到我调用 .read 的事实。在 ActionDispatch::Http::Uploaded
我在 Rails 4.2.1 之上使用 Grape 为我们的应用程序提供 API。 但是当我今天检查 Newrelic 的性能时,我发现 RackApp Proc#call和 Grape API::R
你如何使用 ActionDispatch::Routing::RouteSet 识别路径? 我想获取 View 的当前路径。 我试过 ">但是得到了“ActionDispatch::Routing::
在我的 Controller 中更改并保存了一些代码后,RailsDevTweaks 似乎忽略了这一事实并且不会重新加载代码。在日志中它说: RailsDevTweaks: Skipping Acti
几天前我注意到我的网站上有一些异常事件,所以我决定查看生产日志。这是我发现的: Started GET "/" for 74.219.112.36 at 2013-01-11 20:25:05 +00
我正在尝试在 Rails 4 中编写 Ember 应用程序,并决定使用 rails-api对于 api Controller ,同时为不属于单页应用程序的几个页面保持应用程序 Controller 完
我正在关注GridFS with Mongoid and CarrierWave实现一个简单的 has_many 多态关系,当我尝试通过嵌套属性分配创建一个带有头像的新用户时,我得到: Cannot
我有一个 Ruby on Rails 应用程序,它在模板中包含以下内容... " method="post"> 当我通过 https 请求页面时,我最终得到一个与原始请求具有完全相同 url 的表单操
我正在尝试在我的 Rails 应用程序上实现 git push,它会发送 PROPFIND 请求,而 Rails 似乎无法验证该请求。当我尝试时: git 推送 http://localhost:30
我正在学习 clickatell 教程,我的代码如下所示。但是我得到了错误 uninitialized constant ActionDispatch::Routing::Routes (NameEr
我是一名优秀的程序员,十分优秀!