我在创建优惠券时在我的应用程序中添加了自定义验证,优惠券有效期的开始日期应早于结束日期。
validate :to_must_be_after_from
private
def to_must_be_after_from
if valid_to < valid_from
self.errors[:base] << "Coupon cannot expire before the start of its validity period."
end
end
valid_to和valid_from是日期字段。
运行此命令时,发生NoMethodError。我对此有以下疑问,
答案 0 :(得分:3)
大多数运算符实际上是Ruby中的方法。这段代码:
valid_to < valid_from
仅仅是...的语法糖
valid_to.<(valid_from)
错误消息几乎是不言自明的,例如,必须使用保护子句确保valid_to
和valid_from
不是nil
,例如:
def to_must_be_after_from
return if valid_to.blank? || valid_from.blank?
# rest of the code
end
答案 1 :(得分:0)
首先,您需要检查有效起始于还是有效至为空白。那么您可以检查该值是小于还是大于。
def to_must_be_after_from
return if valid_from.blank? || valid_to.blank?
if valid_from < Date.today
errors.add(:base, "You can't select past dates in valid from")
elsif valid_to < valid_from
errors.add(:base, "valid to can't be before the valid from date")
end
end
答案 2 :(得分:0)
基于错误消息-
您正在尝试比较one variable is nil
中的变量。
在验证之前,您可以检查valid_to
和valid_from
是否都具有正确的值吗?
答案 3 :(得分:-1)
您的错误表明valid_to
为nil,这就是为什么您不能对nil类使用<
运算符。
def to_must_be_after_from
return if valid_from.blank? || valid_to.blank?
if valid_to.to_date < valid_from.to_date
errors.add(:base, "valid to can't be before the valid from date")
end
end