Rails:JSON中的验证错误代码

时间:2013-12-06 11:58:48

标签: ruby-on-rails json

所以,我正在编写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没有提供为验证错误设置错误代码的能力。如何解决这个问题?

3 个答案:

答案 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?