我需要为我的AR模型添加自定义验证:订单模型带有“已批准”属性 - 此属性无法批准两次。它是布尔属性。我不明白如何检查此属性是否已被批准。
validate :cannot_be_approved_twice
def cannot_be_approved_twice
errors[:base] << ERROR_MSG if ...
end
我该如何检查?谢谢!
答案 0 :(得分:0)
如果已经approved
,那么该字段的值将是某个而不是nil
,所以你可以这样做:
def cannot_be_approved_twice
errors[:base] << ERROR_MSG unless approved.nil?
end
如果它被批准,如果它具有true
值,那么你可以这样做:
def cannot_be_approved_twice
errors[:base] << ERROR_MSG if approved
end
希望这有帮助。
答案 1 :(得分:0)
我更喜欢将错误附加到已批准的属性,因此错误将是这样的
weather_hourly_icon
当您检测到用户正在尝试更改该值时,此validate :prevent_double_approval, if: :some_check
def prevent_double_approval
errors[:approved] << "can't be approved more than once" if approved?
end
方法应为true,然后内部检查some_check
会在第二次批准之前检查该值是否已为真。
答案 2 :(得分:0)
您可以通过检查验证中的先前值来执行此操作。像这样:
def cannot_be_approved_twice
errors[:approved] << "can't be approved more than once" unless self.approved_was.nil?
end
“_was”后缀在更新前给出了值。所以,如果它不是零,则有人将其设置为真或假(意味着批准或不批准)。
<强>更新强>
我读完你的评论,并意识到创建订单时它被设置为假(最初,我认为它设置为零,所以你可以批准或不赞成它)。因此,如果该字段最初设置为false,则上述方法变为:
def cannot_be_approved_twice
errors[:approved] << "can't be approved more than once" if self.approved_was # if approved field was true (approved)
end
还有一件事,你用订单更新的方式(order.update!(),使用bung),并且你的订单已被批准,那么你的应用程序将因验证错误而失败,因为bung(!)明确地告诉应用程序在验证错误的情况下失败。您可能只想使用“更新”方法而不是“更新!”。