Return Granite 验证错误 JSON
Return Granite validation errors as JSON
我有一个经过一些验证的 Granite User
模型。当有人向 users/new
发出 POST
请求时,我想 return 验证错误(如果有的话)为 JSON。目前,我有:
if user.errors.size > 0
halt env, status_code: 500, response: user.errors.to_json
end
但是当我尝试编译时,我得到:
in /usr/local/Cellar/crystal/0.26.1/src/json/to_json.cr:66: no overload
matches 'Granite::Error#to_json' with type JSON::Builder
Overloads are:
- Object#to_json(io : IO)
- Object#to_json()
each &.to_json(json)
^~~~~~~
所以问题是 User#errors
是一个 Array(Granite::Error)
,即 Array
持有 Granite::Error
。不幸的是,它看起来不像 Granite::Error
实现了 to_json(JSON::Builder)
方法(即方法 to_json
采用类型 JSON::Builder
的参数),Array#to_json
依赖于(您看到的那个片段来自 Array#to_json
的实现,您可以 view on GitHub。)。
我建议您使用 JSON.build
自行构建 JSON。这具有额外的副作用,即保持您响应的 JSON(我想它正在被某些客户端使用)完全在 您的 控制中。如果 Granite 的开发人员要更改他们在 JSON 中编码 Granite::Error
的方式,而您正在使用他们的 to_json
方法,则更改不会在编译时引发任何问题。
作为旁注,我建议不要使用状态代码 500 来表示验证错误,因为这通常是为服务器内部的意外错误保留的。 4xx 错误(例如 400 - 错误请求)会更合适。作为第二个旁注,将 POST
设置为 /users
端点会比 /users/new
.
更多 RESTful
进行这些更改后,结果片段如下:
if user.errors.size > 0
errors_as_json = JSON.build do |json|
json.array do
user.errors.each do |error|
json.string error.to_s
end
end
end
halt env, status_code: 400, response: errors_as_json
end
我有一个经过一些验证的 Granite User
模型。当有人向 users/new
发出 POST
请求时,我想 return 验证错误(如果有的话)为 JSON。目前,我有:
if user.errors.size > 0
halt env, status_code: 500, response: user.errors.to_json
end
但是当我尝试编译时,我得到:
in /usr/local/Cellar/crystal/0.26.1/src/json/to_json.cr:66: no overload
matches 'Granite::Error#to_json' with type JSON::Builder
Overloads are:
- Object#to_json(io : IO)
- Object#to_json()
each &.to_json(json)
^~~~~~~
所以问题是 User#errors
是一个 Array(Granite::Error)
,即 Array
持有 Granite::Error
。不幸的是,它看起来不像 Granite::Error
实现了 to_json(JSON::Builder)
方法(即方法 to_json
采用类型 JSON::Builder
的参数),Array#to_json
依赖于(您看到的那个片段来自 Array#to_json
的实现,您可以 view on GitHub。)。
我建议您使用 JSON.build
自行构建 JSON。这具有额外的副作用,即保持您响应的 JSON(我想它正在被某些客户端使用)完全在 您的 控制中。如果 Granite 的开发人员要更改他们在 JSON 中编码 Granite::Error
的方式,而您正在使用他们的 to_json
方法,则更改不会在编译时引发任何问题。
作为旁注,我建议不要使用状态代码 500 来表示验证错误,因为这通常是为服务器内部的意外错误保留的。 4xx 错误(例如 400 - 错误请求)会更合适。作为第二个旁注,将 POST
设置为 /users
端点会比 /users/new
.
进行这些更改后,结果片段如下:
if user.errors.size > 0
errors_as_json = JSON.build do |json|
json.array do
user.errors.each do |error|
json.string error.to_s
end
end
end
halt env, status_code: 400, response: errors_as_json
end