Настройка Time.zone в Padrino

#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.