带闰年的年、月、日的Rails条件验证(不带日期对象)



我使用的模型具有start_year, start_month, start_day和end_year, end_month和end_day的单独值。在这种情况下,我有充分的理由不使用内置的Ruby Date对象。只有start_year值应该验证是否存在。

我想做的:检查start_day或end_day值是否对给定月份有效,包括闰年。所以如果用户输入一月作为月份,它应该是1..31,但如果是二月,应该是1。28除非年份是闰年(我知道我可以将年份输入Date对象并检查闰年,所以这没有问题)。

我只是在努力与语法,我认为问题是,我从根本上误解了如何使用条件验证,但无法弄清楚如何,这是我的代码的一部分:

validates :start_day, inclusion: { in: 1..31, allow_nil: true, message: "invalid: up to 31 is allowed for the selected month" }, if: proc { |a| a.start_month.odd? }
validates :start_day, inclusion: { in: 1..30, allow_nil: true, message: "invalid: up to 30 is allowed for the selected month" }, if: proc { |a| a.start_month.even? } && proc { |a| a.start_month != 2 }
validates :start_day, inclusion: { in: 1..28, allow_nil: true, message: "invalid: up to 28 is allowed for the selected month and year" }, if: proc { |a| a.start_month == 2 } && proc { |a| !Date.leap?(a.start_year) }
validates :start_day, inclusion: { in: 1..29, allow_nil: true, message: "invalid: up to 29 is allowed for the selected month and year" }, if: proc { |a| a.start_month == 2 } && proc { |a| Date.leap?(a.start_year) }

当我尝试创建一个具有有效日期的新对象时,它可以工作。当我尝试创建一个无效日期(例如100年的1月32日)时,它会为抛出错误消息在这些验证中,if语句应该确保只执行相关的验证(对于奇数月或偶数月,或二月)。如果我省略月份,它会抛出一个错误,因为它试图传递一个不存在的月份来调用。odd?或羰基化合物?方法on,同样的问题与Date.leap?还有年份。

我想要的:如果其他值不存在,模型应该忽略某些验证,并且只应用那些给定其他值的适当验证。我很确定我用错了这些if语句,或者过程,但不知道为什么。如有任何帮助,不胜感激。

在这种情况下,您可以使用自定义验证器或自定义方法验证

然后像这样做:

validate :days_in_a_month
private
def days_in_a_month
err, days = false, 0
case
when start_month.odd?
err, days = true, 31 if not start_day.in? 1..31
when start_month.even? && start_month != 2
err, days = true, 30 if not start_day.in? 1..30
when start_month == 2
if Date.leap?(start_year)
err, days = true, 29 if not start_day.in? 1..29
else
err, days = true, 28 if not start_day.in? 1..28
end
end
if err
errors.add(:start_day, "invalid: up to #{days} is allowed for the selected month")
end
end

相关内容

  • 没有找到相关文章

最新更新