布尔属性的自定义验证Rails

时间:2015-07-26 15:09:03

标签: ruby-on-rails

我需要为我的AR模型添加自定义验证:订单模型带有“已批准”属性 - 此属性无法批准两次。它是布尔属性。我不明白如何检查此属性是否已被批准。

validate :cannot_be_approved_twice

  def cannot_be_approved_twice
    errors[:base] << ERROR_MSG if ...
  end

我该如何检查?谢谢!

3 个答案:

答案 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(!)明确地告诉应用程序在验证错误的情况下失败。您可能只想使用“更新”方法而不是“更新!”。