date.future?有时是不正确的

时间:2018-07-05 23:44:48

标签: ruby-on-rails

我有一个验证,涉及检查将来是否compdate字段。 compdate字段的类型为date。对此的自定义验证如下所示:

class Game
  validate :compdate_not_in_future

 def compdate_not_in_future
    return if compdate.nil?
    return unless compdate.future?
    errors.add(:compdate, 'cannot be in the future')
  end
end

我用这样的rspec测试进行了测试。

it { expect(build(:game, compdate: Date.today).valid?).to be true }
it { expect(build(:game, compdate: 1.day.from_now.to_date).valid?).to be true }

这些测试可能会失败,具体取决于一天中的时间。我怀疑这是由于我的时区与UTC的关系造成的。我该如何测试并更正验证程序,以便无论用户处于哪个时区,它都能按预期工作,例如如果用户输入其时区中的今天的日期,则验证将通过;如果日期大于其时区中的今天,则验证将失败。

1 个答案:

答案 0 :(得分:0)

基于添加到问题和此post的评论,我提出了以下解决方案。

我介绍了一种方法match_zone,该方法具有玩游戏的时区。然后,该类开始了

class Game
  validate :compdate_not_in_future

 def compdate_not_in_future
    return if compdate.nil?
    Time.use_zone(match_zone) do
       return unless compdate.future?
    end
    errors.add(:compdate, 'cannot be in the future')
  end
end

测试是这样的:

it { expect(build(:game, compdate: Time.use_zone(match_zone) { Date.current }).valid?).to be true }

it { expect(build(:game, compdate: Time.use_zone(match_zone) { Date.current + 1.day}).valid?).to be true }