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

Ruby on rails rails 4验证同一参数的存在性和长度,ruby-on-rails,validation,Ruby On Rails,Validation,这样进行验证是否是一个好主意: validates :serialnumber, presence: true, length: {7..20}, format: {with: /\d{7,20/} 如您所见,如果我不键入serialnumber,它会生成三个错误。 我只想看到一个错误。 如果我没有键入任何内容,我只希望看到“需要序列号”。 如果我键入123ABC我只希望看到“错误长度” 如果我输入123-ABC-123我只想看到“格式错误” 怎么做 关于您可以将其拆分为2个验证器,检查这是否

这样进行验证是否是一个好主意:

validates :serialnumber, presence: true, length: {7..20}, format: {with: /\d{7,20/}
如您所见,如果我不键入serialnumber,它会生成三个错误。 我只想看到一个错误。 如果我没有键入任何内容,我只希望看到“需要序列号”。 如果我键入
123ABC
我只希望看到“错误长度” 如果我输入
123-ABC-123
我只想看到“格式错误”

怎么做


关于

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

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

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

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

据我所知,您一次只希望看到一条错误消息。如果是这样的话,这个方法可能会有所帮助。例如

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:serial\u number\u validation\u one\u
私有的
def序列号\u验证\u逐个\u
如果!self.serial\u number.present?
错误。添加(:序列号,“必须存在!”)
elsif self.serial_number.length<7 | self.serial_number.length>20
错误。添加(:序列号,“长度必须介于7和20之间!”)
elsif self.serial_number.match()
错误。添加(:序列号,“必须正确格式化!”)
结束
结束

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

调用。据我所知,您一次只希望看到一条错误消息。如果是这样的话,这个方法可能会有所帮助。例如

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:serial\u number\u validation\u one\u
私有的
def序列号\u验证\u逐个\u
如果!self.serial\u number.present?
错误。添加(:序列号,“必须存在!”)
elsif self.serial_number.length<7 | self.serial_number.length>20
错误。添加(:序列号,“长度必须介于7和20之间!”)
elsif self.serial_number.match()
错误。添加(:序列号,“必须正确格式化!”)
结束
结束
请记住,自定义验证方法由
validate
调用,而不是由
validates
调用