NoMethodError:nil:NilClass的未定义方法“ <”

时间:2019-03-20 10:10:37

标签: ruby-on-rails validation model

我在创建优惠券时在我的应用程序中添加了自定义验证,优惠券有效期的开始日期应早于结束日期。

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。我对此有以下疑问,

  1. '<'是一个运算符,而不是一个函数,那么如何发生这种错误。
  2. 如何解决此问题并使代码正常运行。

4 个答案:

答案 0 :(得分:3)

大多数运算符实际上是Ruby中的方法。这段代码:

valid_to < valid_from

仅仅是...的语法糖

valid_to.<(valid_from)

错误消息几乎是不言自明的,例如,必须使用保护子句确保valid_tovalid_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_tovalid_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