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