我的Rails-app中有一个页面应该显示游览,以便start_date字段等于明天的日期(GMT + 00)
我在application.rb中使用默认时区
# Set Time.zone default to the specified zone and make Active Record ...
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'
但是存在问题。我会看到今天甚至昨天的日期,而不是从明天开始显示旅行日期的页面。
我在页面上提供了以下信息:
Time.zone (GMT+00:00) UTC
Date.today_local_zone 2013-11-20
Date.today 2013-11-20
Time.now 2013-11-20 00:48:21 +0000
我的控制器中的代码:
puts "... #{ Tour.upcoming.order('start_date ASC').to_sql }"
@tours = Tour.upcoming.order('start_date ASC')
游览模型中的范围
class Tour < ActiveRecord::Base
attr_accessible :start_date, :title
scope :upcoming, where('tours.start_date > ?', Date.today_local_zone)
end
简要介绍我的today_local_zone方法:
class Date
def self.today_local_zone
Time.zone.now.to_date
end
end
以下是我的日志中的一行(查询日期与日志中的日期不同)
2013-11-20T00:48:21.178380+00:00 app[web.1]: ... SELECT "tours".* FROM "tours" WHERE (tours.start_date > '2013-11-19') ORDER BY start_date ASC
heroku restart
之后或部署日期更加正确heroku run rails c
中,所有日期都是正确的UPD:
我尝试记录Time.zone.now.to_s.to_date
的值。它的价值是正确的。
请同时查看my gist:
答案 0 :(得分:1)
我在第一次审核时错过了这个。问题出在您的范围声明中:
scope :upcoming, where('tours.start_date > ?', Date.today_local_zone)
这个定义是错误的。它在加载类时加载Date.today_local_zone。你需要把它包装在Proc中。所以它应该是:
scope :upcoming, lambda { where('tours.start_date > ?', Date.today_local_zone) }
确保每次使用范围时都执行Date.today_local_zone。