比较轨道模型验证的时间不起作用

时间:2014-12-21 01:38:12

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

我正在尝试让我的验证阻止用户创建将来不存在的Appointment。我的验证工作是阻止创建过去的约会,但它也阻止用户今天创建约会,这应该被允许。这有什么不对?

Appointment.rb:

validates :pickuptime, presence: true
validate  :pickuptime_is_in_future

byebug
def pickuptime_is_in_future
  if pickuptime < Time.now
    errors.add(:pickuptime, "Appointment must be in the future")
  end
end

我调试了这个(使用byebug),在byebug行的位置,我发现了以下内容:

(byebug) Time.now
2014-12-20 20:33:35 -0500

(byebug) pickuptime
Sat, 20 Dec 2014 21:34:00 UTC +00:00

(byebug) pickuptime < Time.now
true

如果Time.now是晚上8:33并且接送时间是晚上9:34,为什么会这样呢?

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

TlDR;

您的时区未设置。

可以使用

获取所有可用时区的列表
rake time:zones:all

并设置您的时区。

# application.rb:
class Application < Rails::Application
 config.time_zone = 'Eastern Time (US & Canada)'
end

长答案

由于Time Zones和您的本地系统UTC Offset,您看到了不同之处。

(byebug) Time.now
2014-12-20 20:33:35 -0500

此时间是UTC时间-05:00小时或5小时

(byebug) pickuptime
Sat, 20 Dec 2014 21:34:00 UTC +00:00

此时间为UTC时间00:00或0小时

 (byebug) pickuptime < Time.now
 true

因此,这是正确的,因为您的当地时间实际上是

Sun, 21 Dec 2014 01:33:35 UTC +00:00

pickuptime

Sat, 20 Dec 2014 21:34:00 UTC +00:00

并且因为您的时区未设置而发生。为此,请按照以下说明。

可以使用

获取所有可用时区的列表
rake time:zones:all

并设置您的时区。详见ActiveSupport::TimeZone

# application.rb:
class Application < Rails::Application
 config.time_zone = 'Eastern Time (US & Canada)'
end