我在padrino项目中设置默认activessupport::TimeZone时遇到问题。
在我的靴子。我有
Padrino.after_load do
Time.zone = 'UTC'
ActiveRecord::Base.default_timezone = :utc
end
我的控制器文件有:
MyApp::App.controllers :post do
get :index do
puts Time.zone # this returns nil
render 'index'
end
end
当我点击索引操作时,我得到nil的time。zone。好像有什么东西在覆盖时间。
- 我可以在boot.rb中设置时区后打印出来。所以我知道它是设置的。
你可以这样设置:
Time.zone_default = Time.find_zone!("UTC")
这就是你所需要的,但详见下文。
上面的工作为我与activessupport 5.0.2。我研究了Time.zone
是如何实现的:
class Time
include DateAndTime::Zones
class << self
attr_accessor :zone_default
# Returns the TimeZone for the current request, if this has been set (via Time.zone=).
# If <tt>Time.zone</tt> has not been set for the current request, returns the TimeZone specified in <tt>config.time_zone</tt>.
def zone
Thread.current[:time_zone] || zone_default
end
然后我猜测它可能在当前与Padrino的线程中丢失。
假设Time.zone
需要为每个线程设置一次。无论出于何种原因,在Padrino.before_load
中分配区域时并不总是如此。我没有深入研究这个问题,但我确信会找到一个更好的解决方案,在每个线程中分配它。
如果你想要每个用户的时区,而不仅仅是整个应用程序的全局时区,你需要进一步挖掘
在我的boot.rb
中,我有:
Padrino.before_load do
Time.zone = 'UTC'
end
和在我的database.rb
:
ActiveRecord::Base.default_timezone = :utc
在控制台测试后似乎可以工作:
ruby-2.1.4$ padrino c
=> Loading development console (Padrino v.0.12.4)
2.1.4 :001 > Time.zone
=> #<ActiveSupport::TimeZone:0x007fbff62ed5c0 @name="UTC", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Etc/UTC>, @current_period=#<TZInfo::TimezonePeriod: nil,nil,#<TZInfo::TimezoneOffset: 0,0,UTC>>>>
2.1.4 :002 > Time.zone.now
=> Tue, 30 Dec 2014 13:14:57 UTC +00:00
2.1.4 :003 > Time.current
=> Tue, 30 Dec 2014 13:15:01 UTC +00:00
2.1.4 :004 > ActiveRecord::Base.default_timezone
=> :utc
注意:已测试ruby v2.1.4, padrino v0.12.4, activessupport/activerecord v4.2.0。