rails 4 验证同一参数的存在和长度

rails 4 validates presence and length on the same parameter

像这样进行验证是个好主意吗:

validates :serialnumber, presence: true, length: {7..20}, format: {with: /\d{7,20/}

如您所见,如果我不输入序列号,它会生成三个错误。 我只想看到一个错误。 如果我什么都不输入,我只想看到 'serial number is required'。 如果我输入 123ABC 我只想看到 'wrong length' 如果我输入 123-ABC-123 我只想看到 'wrong format'

怎么做?

此致

您可以将其拆分为 2 个验证器,检查这是否可行

validates :serialnumber, presence: true
validates :serialnumber, length: {7..20}, format: { with: /\d{7,20}/ }, allow_blank: true

据我了解,您希望一次只看到一条错误消息。如果是这种情况,那么 custom validation 方法可能会有所帮助。例如

validate :serial_number_validation_one_by_one

private

def serial_number_validation_one_by_one
  if !self.serial_number.present?
    errors.add(:serial_number, "must be present!")
  elsif self.serial_number.length < 7 || self.serial_number.length > 20
    errors.add(:serial_number, "must have length between 7 and 20!")
  elsif self.serial_number.match(<your regex pattern here>)
    errors.add(:serial_number, "must be properly formatted!")
  end
end 

请记住,自定义验证方法是由 validate 而不是 validates 调用的。