Странность часовых поясов в рельсах - PullRequest
2 голосов
/ 06 апреля 2009

Это действительно странная проблема Rails - я гуглил, чтобы посмотреть, связано ли это с известной ошибкой, но ничего не нашел - будет благодарен за полезные ссылки, а также за решения.

Я могу свести проблему к следующему:

Если я запускаю приложение Rails и выполняю следующий код Rails через HTTP-запрос.

Time.zone = 'Europe/London'
logger.info Time.zone.inspect

В журнале показывается часовой пояс

#<ActiveSupport::TimeZone:0x3d7438c @tzinfo=nil, @name="UTC", @utc_offset=0>

В самом следующем запросе (и большинстве последующих запросов) журнал для тех же строк кода показывает это

#<ActiveSupport::TimeZone:0x46cc100 @tzinfo=#<TZInfo::DataTimezone: Europe/London>, @name="Europe/London", @utc_offset=nil>

Кто-нибудь знает, что, черт возьми, происходит?

(я использую Rails 2.3.2, если это поможет)

Edit: похоже, что в Rails 2.2.2 такой проблемы нет, поэтому сейчас я вернусь к этому.

1 Ответ

4 голосов
/ 06 апреля 2009

ActiveSupport :: TimeZone перехватывает Time.zone, чтобы его можно было травить и восстанавливать. По какой-то причине это делается лениво (именно поэтому ваши изменения не отображаются сразу). Здесь возникают кросс-сессионные и многопоточные проблемы, и я не знаю, как это правильно. Все, что я могу сказать, это:

  • То, что вы видите, действительно происходит
  • Это происходит потому, что так закодировано
  • Есть открытые пункты TODO об исправлении этого
  • Непонятно (по крайней мере, мне), каким должно быть глобально «правильное» поведение.

Основная проблема с такого рода функциями заключается в том, что не существует четкого способа определить суть намерения прикладного программиста изнутри сеттера. Это настройка для всего сайта? Широкая сессия? Мимолетная фантазия?

В соглашении о парадигме конфигурации такие вещи требуют соглашения, чтобы разрешить их, а в этой области его еще нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...