Rails 4验证num1> num2> NUM3

时间:2013-10-04 04:00:11

标签: ruby-on-rails validation numbers

我目前正面临在Rails 4上使用自定义验证的2个问题。首先,如何使以下代码更通用和有效(如果可能的话)?

validates :p1, presence: true, numericality: { only_integer: false }
validate :p1_is_greater_than_p2_and_p3
validate :p2_between_p1_and_p3
validate :p3_is_less_than_p2_and_p1

def p1_is_greater_than_p2_and_p3
  if self.p1.present?
    errors.add(:p1, 'p1 must be greater than everything') unless 
      (self.p1 > self.p2) && (self.p1 > self.p3)
  end
  true
end

def p2_between_p1_and_p3
  if self.p3.present?
    errors.add(:p2, 'p2 bewteen p1 and p3') unless 
      self.p2.between?(self.p1, self.p3)
  end
  true
end

def p3_is_less_than_p2_and_p1
  if self.p2.present? and self.p3.present?
    errors.add(:p3, 'p3 must be inferior to eveything') unless 
      (self.p2 > self.p3) && (self.p1 > self.p3)
  end
  true
end

真的很臃肿,不是吗?

第二个问题,在errors.add上,我可以传递符号和错误消息。但是,如果我没有传递任何消息,我如何为我的语言环境定义自定义yml键?如:

en:
  activerecord:
    errors:
      models:
        prices:
          attributes:
            custom_key_message_here: 'p1 must be greater than everything'

我希望在语言环境和模型之间保持这种分离。但是,如果我没有传递任何消息,它会显示is invalid。我想要更多的东西。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

快速查看numericality validator,您不能只使用:

validates :p1, presence: true, numericality: { greater_than: :p2 }
validates :p2, presence: true, numericality: { greater_than: :p3 }
validates :p3, presence: true

只要p1 > p2p2 > p3,您就不需要直接比较p1p3。这假设所有三个值都必须存在,但如果它们是可选的,你可以调整它们的工作。