我目前正面临在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
。我想要更多的东西。
感谢您的帮助。
答案 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 > p2
和p2 > p3
,您就不需要直接比较p1
和p3
。这假设所有三个值都必须存在,但如果它们是可选的,你可以调整它们的工作。