Каков наилучший способ избежать потери часовых поясов в представлениях Rails? - PullRequest
3 голосов
/ 10 мая 2011

У меня есть представление редактирования для модели Event с полями name, start_time и end_time. На мой взгляд, форма выглядит примерно так:

# ...
# form with:
#  - event name
#  - datetime_select for event start_time (in business's local time zone)
#  - datetime_select for event end_time (in business's local time zone)

Теперь вот проблема: к start_time и end_time прикреплен часовой пояс, но это время теряется, когда мы визуализируем представление, потому что datetime_select не включает в себя поле для часового пояса. В результате у нас есть «время UTC», которое фактически является местным временем без его часового пояса.

Напомним, что ситуация выглядит следующим образом, когда мы визуализируем форму в представлении, а затем сразу отправляем ее без внесения каких-либо изменений:

db time:                 2011-05-15 @ 1100 UTC
converted to local time: 2011-05-15 @ 0600 CDT
time stored in view:     2011-05-15 @ 0600 UTC (time zone info lost)
time posted back to db:  2011-05-15 @ 0600 UTC

Обратите внимание, что время, которое было сохранено, было 1100 UTC первоначально, но сейчас 0600 UTC, хотя мы не внесли никаких изменений. Это серьезная ошибка.

Есть несколько подходов, которые мы могли бы использовать здесь. Какой самый умный способ избежать потери часовых поясов при публикации в представлении? (Обратите внимание, что модель может обновляться иными способами, чем публикация формы, например, через API.)

Ответы [ 2 ]

0 голосов
/ 20 июля 2011

вы можете попробовать использовать драгоценный камень delocalize: https://github.com/clemens/delocalize

0 голосов
/ 11 июля 2011

Это никогда не кажется очень удовлетворительным, но я обычно справляюсь с этим, создавая пару новых методов для виртуального атрибута с именем local_time или time_formatted или что-то в этом роде, которые конвертируют взад и вперед из времени UTC, которое хранится в БД.

В этом примере поле db имеет значение «deadline», а виртуальный атрибут - «deadline_formatted»:

def deadline_formatted
  self.deadline
end

def deadline_formatted= s
  self.deadline = s
end

Затем в форме

<%= f.label :deadline_formatted, "Deadline" %>
<%= f.text_field :deadline_formatted %>

Посредством некоторой магии рельсов, которую я до сих пор не совсем понимаю *, этого достаточно, чтобы сделать это - похоже, это не должно работать, но это работает.По крайней мере, для меня.

* часть, которую я не понимаю, заключается в том, что установка поля крайнего срока в форме будет вызывать метод deadline = со значением из текстового поля.Вместо этого я вызываю метод deadline_formatted =, который просто передает результат в deadline =, так что вы думаете, что результат будет идентичным.Но, так или иначе, время переводится туда-сюда из UTC (база данных) в местное время (форма).

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