#ruby #timezone #padrino
#ruby #Часовой пояс #падрино
Вопрос:
У меня возникли проблемы с настройкой ActiveSupport::TimeZone по умолчанию в моем проекте padrino.
В моем boot.rb у меня есть
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
Когда я нажимаю действие индекса, я получаю ноль для Time.zone. Кажется, что что-то может перезаписывать Time.zone или оно загружается неправильно.
- Я могу распечатать часовой пояс после его установки в boot.rb. Итак, я знаю, что он был установлен.
Комментарии:
1. Эй, Моемарс, тебе удалось это решить?
2. нет, у меня нет. в консоли это работает, как предложено ниже, но не в контроллере.
3. То же самое для меня. Работает в тестах, но не при запуске реального веб-приложения в dev :/
Ответ №1:
Вы можете установить его следующим образом:
Time.zone_default = Time.find_zone!("UTC")
Это все, что вам нужно, но подробности см. Ниже.
Вышесказанное сработало для меня с activesupport 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
. Я не вникал в это, но я уверен, что можно найти более приятное решение, которое назначает его в каждом потоке.
Если вам нужны часовые пояса для каждого пользователя, а не только глобальные для всего приложения, вам нужно будет копать дальше.
Ответ №2:
В моем 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, activesupport / activerecord v4.2.0.