我正在使用自定义验证来检查卡是否已过期(它有一个月/年)。
这就是我所拥有的:
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_month
和exp_year
字段。我尝试使用符号形式(:exp_month
)但不出意外,这也不起作用。
如何让它发挥作用?
答案 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?或者仅在保存之前执行验证
复制粘贴物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