rails自定义日期验证

时间:2016-06-30 22:29:58

标签: ruby-on-rails validation date activerecord

在表单中,用户必须选择一个月和一年。我想根据月份确保日期不是。因此,假设当前日期是2016年1月7日,在这种情况下,用户应该可以选择07/2016但不应该选择08/2016。

验证似乎有效,但看起来不太好。有没有更简单的方法 实现这个目标?

validate :founded_in_the_past

def founded_in_the_past
  if founded && ((founded.month > Date.current.month && founded.year == Date.current.year) 
    && founded.year > Date.current.year)
      errors.add :base, "Founding date must be in the past."
  end
end

2 个答案:

答案 0 :(得分:1)

您可以使用>=例如

来删除一个条件
if founded && (founded.month > Date.current.month && founded.year >= Date.current.year)

答案 1 :(得分:1)

而不是使用月份和年份检查,而不是通过使用月份和年份创建日期对象来直接比较日期。

validate :founded_in_the_past

def founded_in_the_past
  if founded && (Date.new(founded.year, founded.month, 1) > Date.current)
    errors.add :base, "Founding date must be in the past."
  end
end

在您的代码中,如果您选择年份为2017而月份为5,则可以选择此日期

founded && ((founded.month > Date.current.month && 
  founded.year == Date.current.year) && 
  founded.year > Date.current.year)
  

established = true

     

established.month> Date.current.month = false

     

established.year == Date.current.year = false

     

established.year> Date.current.year = true

如果我们根据您的情况进行映射,您的情况将会是

  

true&& ((false&& false)&& true)

这将返回false,并允许用户选择将来的日期