【问题标题】:Rails: validation error codes in JSONRails:JSON 中的验证错误代码
【发布时间】:2013-12-06 11:58:48
【问题描述】:

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

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

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

【问题讨论】:

标签: ruby-on-rails json


【解决方案1】:

您可以在呈现响应时使用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: [
        ...
    ]
}

您还可以嵌入其他属性。

【讨论】:

  • 这只是一个拼写错误的例子。问题是:如何在 Rails 中为验证错误添加错误代码?
  • 谢谢。但我想做一些不同的事情。我想将每种验证错误与将放置在 JSON 响应正文中的唯一错误代码相关联。 {error_code: 50, error_message: "Email can not be blank"},例如。
  • 从我的建议开始做你想做的事情并不难。尝试处理一些代码,不要期望提供复制/粘贴代码的答案。
  • 我认为问题更多是关于如何为每个验证消息提供唯一代码。由于错误文本可能会因翻译而改变,因此如果您想对客户端做出反应,则不能使用它。因此,答案似乎是否定的,没有办法在 Rails 中为每个验证添加唯一的错误代码。
【解决方案2】:

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

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,因此您不应该在此过程中破坏任何其他内容。

【讨论】:

    【解决方案3】:

    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?

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 2017-06-20
      • 2011-05-22
      • 1970-01-01
      • 2017-09-26
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多