在您选择时间后第二个过去时,验证时间不是过去而不会触发错误

时间:2016-07-21 19:35:16

标签: ruby-on-rails ruby validation datetime ruby-on-rails-4

我对我的模型进行了验证:

def time_in_future
  if start_at?
    errors[:base] << 'The Start Date can not be in the past.' if start_at < Time.zone.now
  end
end

但每次我尝试保存时,我都会收到我在验证中要求的错误,这是有道理的。我假设因为无论何时保存,时间都降到第二,我的datetimepicker上自动加载的时间将是过去的一段时间,因为选择时间需要一秒多的时间,然后点击“保存”。 / p>

我想过几个解决方案,其中最简单的解决方法是将错误消息读成"The Start Date must be a time in the Future."足够简单。或者,在保存之前,start_at时间将在未来的某个时间自动保存,我在想15分钟。

我认为这必定是人们经常遇到的情况,是否有更好或更常见的方法来解决这种情况?

感谢您的投入。

编辑:

接受输入后的更新方法:

def time_in_future
  if start_at? do
      errors[:base] << 'The Start Date must be in the future. Seconds count!' if start_at < DateTime.current + 15.minutes
  end
  end
end

1 个答案:

答案 0 :(得分:1)

我在大型生产网站上实际实施的另一个可能的建议是拥有宽限期。&#34;对我们来说,这个宽限期是2个小时,但可能只有几秒钟 - 这取决于你的确切需要。

所以,我的代码看起来像:

def time_in_future
  if start_at?
    errors[:base] << 'The Start Date can not be in the past.' if start_at < Time.current + 2.hours
  end
end

此模型的好处是可以为每个环境设置2.hours,这样可以更轻松地测试和排除模型的其他方面start_at