Rails验证错误消息:将响应代码添加到默认验证器

时间:2017-07-25 13:07:10

标签: ruby-on-rails ruby validation ruby-on-rails-5 http-status-codes

我正在寻找一种最佳实践/解决方案,使用不同的http响应代码呈现响应而不是422 - 不可处理的实体。

我有一个简单的验证器:

validates :name, presence: true, uniqueness: {message: 'duplicate names are not allowed!'}

我希望在此验证失败时返回状态码409 - 冲突(:冲突)。可能的解决方案:

  1. 将状态代码添加到错误哈希中,例如errors.add(status_code: '409')。然后从错误中呈现状态代码,或者如果存在多个则呈现422。
  2. 上述解决方案的问题在于我不知道如何在'标准'验证器上调用errors.add函数。

    我的渲染代码:

    if model.save
        render json: model, status: :created
      else
        render json: model.errors, status: :unprocessable_entity
      end
    

    我希望根据验证结果呈现不同的状态代码。

1 个答案:

答案 0 :(得分:1)

在这种情况下,创建自定义验证器可能是一种方法,您可以始终扩展复杂性

validates_with NameValidator

自定义验证器

class NameValidator < ActiveModel::Validator
  def validate(record)
    if record.blank? || Model.where(name: record.name).exists?
      record.errors.add(:base, "Duplicate names not allowed!")
    end
  end
end