Rails:JSON中的validation错误代码

所以,我正在编写Rails web应用程序,该应用程序具有用于移动应用程序的JSON API。 例如,它将POST JSON请求发送到example.com/api/orders以创建订单。

{id: 1, order: { product_name: "Pizza", price: 10000}} 

如果出现validation错误,我可以使用HTTP 422错误代码和json中的order.errors.full_messages进行响应。 但我觉得在JSON响应中有特定的错误代码似乎更好。 不幸的是,似乎Rails没有提供为validation错误设置错误代码的能力。 如何解决这个问题呢?

您可以在呈现响应时使用status选项传递自定义状态代码。

 def create @order = ... if @order.save render json: @order else render json: { message: "Validation failed", errors: @order.errors }, status: 400 end end 

我通常倾向于在validation错误上返回HTTP 400。 该消息是可读状态响应,还附加了错误。

这是一个响应的例子

 { message: "Validation failed", errors: [ ... ] } 

您还可以嵌入其他属性。

我是在追求类似的东西,所以我做的是扩展String例如

 class ErrorCodeString < String def init(value, error_code) @error_code = error_code super(value) end def error_code @error_code end end 

然后在自定义validation中(这不适用于标准validation)我会这样做

  errors.add(:email, ErrorCodeString.new('cannot be blank', 50) 

现在,当您返回JSON时,您可以检查错误值是否为ErrorCodeString并将error_code值添加到输出中。 由于ErrorStringinheritance了String,因此在此过程中不应该破坏其他任何东西。

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}]} 

此function已被移植到Rails 4,另请参阅http://blog.bigbinary.com/2016/05/03/rails-5-adds-a-way-to-get-information-about-types-of-failed -validations.html

另外: 除了rails活动记录validation中的错误消息之外,还有办法返回错误代码吗?