Как правильно установить значение по умолчанию в time_zone_select на основе Time.zone (сокращенно против расширенных имен) в Rails 5.2? - PullRequest
0 голосов
/ 27 мая 2019

Недавно мы увидели, что наши time_zone_select значения по умолчанию неверны.Я думаю, что это могло произойти с момента нашего обновления до Rails 5. Короче, у нас есть следующий фрагмент кода:

f.time_zone_select :timezone, nil, { default: Time.zone.name }

Проблема здесь в том, что time_zone_select компилирует список опций, где значения "сокращенные имена, под которыми я подразумеваю (например) Amsterdam вместо Europe/Amsterdam.

Теперь это не так, когда используется Time.zone.name для установки значения по умолчанию, поскольку это возвращает Europe/Amsterdam.В результате значение по умолчанию не выбрано.

Это ошибка или я что-то упускаю здесь?

1 Ответ

0 голосов
/ 04 июня 2019

Погружение в это показывает, что в версии 5.1.6.2 ActiveSupport :: TimeZone time_zone_select работает как описано, что позволяет нам просто выбрать действительный часовой пояс по умолчанию с Time.zone.name.Несмотря на то, что по умолчанию (например, «Европа / Амстердам») параметры выбора содержат как «Амстердам», так и «Европа / Амстердам».

Поэтому я предполагаю, что изменения, внесенные в ActiveSupport :: TimeZone вВ Rails 5.2.0 недостаточно учтено влияние, которое они оказывают на time_zone_select.На данный момент вместо использования расширенного имени часового пояса (например, «Европа / Амстердам») для выбора значения по умолчанию time_zone_select, я явно ограничиваю его сокращенной формой в качестве обходного пути, например:

# As of Rails 5.2.0 the time_zone_select helper does not accept time zones in format "Europe/Amsterdam"
# anymore. Instead, we should cast this to a selectable value, being "Amsterdam" in this example.
def selectable_time_zone_name(zone_name)
  ActiveSupport::TimeZone.all.find{|tz| tz =~ zone_name }&.name
end

, который мы затем можем использовать следующим образом (сюда входит перенос любого расширенного значения имени, которое может иметь атрибут часового пояса):

<% form.object.timezone = selectable_time_zone_name(selectable_time_zone_name(form.object.timezone) || Time.zone.name) %>
<%= form.time_zone_select :timezone %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...