所以,我正在编写Rails Web应用程序,该应用程序具有用于移动应用程序的JSON API。例如,它将POST JSON请求发送到example.com/api/orders以创建订单。
{id: 1, order: { product_name: "Pizza", price: 10000}}
如果出现验证错误,我可以使用HTTP 422错误代码和json中的order.errors.full_messages进行响应。但我觉得在JSON响应中有特定的错误代码似乎更好。不幸的是,似乎Rails没有提供为验证错误设置错误代码的能力。如何解决这个问题?
答案 0 :(得分:4)
您可以在呈现响应时使用status
选项传递自定义状态代码。
def create
@order = ...
if @order.save
render json: @order
else
render json: { message: "Validation failed", errors: @order.errors }, status: 400
end
end
我通常倾向于在验证错误上返回HTTP 400。该消息是可读状态响应,错误也附加。
这是一个响应示例
{
message: "Validation failed",
errors: [
...
]
}
您还可以嵌入其他属性。
答案 1 :(得分:1)
我是在追求类似的东西,所以我所做的就是扩展String,例如
class ErrorCodeString < String
def init(value, error_code)
@error_code = error_code
super(value)
end
def error_code
@error_code
end
end
然后在自定义验证中(这不适用于标准验证)我会做
errors.add(:email, ErrorCodeString.new('cannot be blank', 50)
现在,当您返回JSON时,您可以检查错误值是否为ErrorCodeString,并将error_code值添加到输出中。由于ErrorString继承了String,因此在此过程中不应该破坏任何其他内容。
答案 2 :(得分:1)
Rails 5有error.details,可以用于它。
在模型中
errors.add(:price, 1023, message: "Transaction value #{price} is above limit (#{maximum_price}).")
在控制器中
format.json { render json: @order.errors.details, status: :unprocessable_entity }
错误详细信息可以是任何内容,例如。你也可以使用:above_limit而不是1023。 API响应正文将如下所示
pp JSON.parse(response)
{"price"=>[{"error"=>1023}]}
此功能已被移植到Rails 4,另请参阅http://blog.bigbinary.com/2016/05/03/rails-5-adds-a-way-to-get-information-about-types-of-failed-validations.html
另外:Is there a way to return error code in addition to error message in rails active record validation?