Rails - 如果另一个字段不为空,则验证字段

时间:2017-10-24 15:13:59

标签: ruby-on-rails validation

我有这样简单的ApplicationRecord类:

class User < ApplicationRecord
  validates :name, presence: true
  validates :surname, presence: true
end

现在我想修改我的代码,以便只有当其中一个字段存在时才必须存在字段。所以,我需要有类似的东西:

if name_is_present? || surname_is_present?
  validate_name
  validate_surname
else
  #don't validate anything
end

我使用标准的Rails表单,因此如果表单无效,我希望显示与具体字段相关的自定义验证消息,就像它在标准验证中一样。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

您可以通过在模型中创建自定义验证方法或创建验证程序类在Rails中创建自己的验证。

验证器的作用非常简单 - 您在模型上运行谓词,如果不满足,则向模型上的errors对象添加错误消息。

class User < ApplicationRecord
  validate :name_or_surname

  private
  def name_or_surname
    if name.present? || surname.present?
      errors.add(:name, "must be present") unless name.present?
      errors.add(:surname, "must be present") unless surname.present?
    end
  end
end

或作为验证员类:

class NameValidator < ActiveModel::Validator
  def validate(record)
    name, surname = record.name, record.surname
    if name.present? || surname.present?
      errors.add(:name, "must be present") unless name.present?
      errors.add(:surname, "must be present") unless surname.present?
    end
  end
end

class User < ApplicationRecord
  validates_with NameValidator
end

在旁注 - 使用 forename 而不是 name - 它是姓氏的伴随词,并且不含糊。

答案 1 :(得分:1)

您应该使用conditional validation

class User < ApplicationRecord
  validates :name, presence: true
  validates :surname, presence: true, unless: :name_blank?

  def name_blank?
    name.blank?
  end
end