验证月份和年份

时间:2014-12-31 12:29:28

标签: ruby-on-rails-4 activemodel

我正在使用自定义验证来检查卡是否已过期(它有一个月/年)。

这就是我所拥有的:

    validate :card_not_expired

    def card_not_expired
      if exp_year > Time.now.year or 
        (exp_year == Time.now.year and exp_month >= Time.now.month)
        true
      end
    end

我收到undefined method ">=" for nil:NilClass消息,大概是因为无法在模型中直接访问exp_monthexp_year字段。我尝试使用符号形式(:exp_month)但不出意外,这也不起作用。

如何让它发挥作用?

2 个答案:

答案 0 :(得分:1)

    def card_not_expired
      if exp_year.present? and (exp_year >= Time.now.year or 
        (exp_year == Time.now.year and exp_month >= Time.now.month))
        true
      end

      # Raise error for expired card
      errors.add(:exp_month, "can't be in the past")
    end

当您创建新对象时执行验证,并且此时您没有exp_year的值,为了工作您必须使用present?或者仅在保存之前执行验证

RailsValidations

复制粘贴物

Active Record对象有两种:与数据库中的行对应的那些和不与数据库对应的行。当您创建新对象时,例如使用新方法,该对象尚不属于该数据库。在对该对象调用save后,它将保存到相应的数据库表中。 Active Record使用new_record?用于确定对象是否已存在于数据库中的实例方法。考虑以下简单的Active

答案 1 :(得分:0)

您可以使用此方法检查卡是否已过期:

def card_expired?
 expiration = Time.utc(exp_year, exp_month, month_days, 23, 59, 59)
 Time.now.utc > expiration
end

def month_days
  mdays = [nil,31,28,31,30,31,30,31,31,30,31,30,31]
  mdays[2] = 29 if Date.leap?(year)
  mdays[exp_month]
end