0

我目前在 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。我想要更明确的东西。

谢谢你的帮助。

4

1 回答 1

1

快速浏览一下numericality验证器,你能不能只使用:

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

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

于 2013-10-04T04:08:23.597 回答