Простое время формы использует неверную зону - PullRequest
0 голосов
/ 29 мая 2018

Я использую simple_form, чтобы установить время начала и окончания события.Тем не менее, он показывает время в неправильном часовом поясе.

Мой контроллер:

class EventsController < ApplicationController
  def new
    @event = Event.new(start_time: 1.hour.since(now), end_time: 2.hours.since(now))
    render 'edit'
  end
  ...
  private
  ...
  def now
    Time.zone.now
  end
end

Мой взгляд (используя slim):

= simple_form_for @event do |f|
  = f.input :name
  = f.input :start_time
  = f.input :end_time

  = f.input :camera_ids, collection: Camera.all, as: :check_boxes

  = f.button :submit, class:'btn-primary'

Я живу в зоне +03:00,И представление отображается оба раза 2 часа назад и 1 час назад соответственно.Это просто время в UTC, однако я хочу его в реальном часовом поясе.Он сохраняется в базе данных с тем же часовым поясом.

Вывод моей консоли для Time.zone.now или Time.current правильный и использует +03:00 часовой пояс.Как я могу объяснить часовые пояса для simple_form?

========

Upd

Я пытался отрендерить время без simple_form.Если я использую = select_datetime @event.start_time.in_time_zone('Moscow'), это работает.

Но установка .in_time_zone('Moscow') для simple_form не дает результата = (Или, может быть, я делаю это неправильно.

У меня также естьпредположим, что это может быть примерно так: simple_form представляет datetime. Если я использую стандартный помощник, он устанавливает значения, такие как start_time[hours] (и т. д.) для каждого поля. simple_form, с другой стороны, устанавливает значения из start_time(4i) (и т. д.) Может быть, проблема где-то там.

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Чтобы получить текущий часовой пояс машины, на которой работает код:

Time.now.localtime

Чтобы изменить часовой пояс для всех действий контроллера EventsController, вы можете проверить этот ответ .

0 голосов
/ 29 мая 2018

Если вы правильно установили в своем config / application.rb

config.time_zone = "Moscow"
config.active_record.default_timezone = :local

, это должно работать.
Я попробовал ваш код с фрагментами, которые вы указали в первую очередь, и на входах отображается местное времяс любыми временными зонами, которые я тестировал (например, «Москва», «Мельбурн» или «Америка / Лос-Анджелес»)

Я не думаю, что проблема связана с simple_form, потому что вы вводите входные данные непосредственно из контроллера (из@event).

Может быть, попытаться отладить ваш контроллер с некоторыми puts, чтобы посмотреть, какой часовой пояс возвращается ...:

class EventsController < ApplicationController

  def new
    start_time = 1.hour.since(now)
    end_time = 2.hours.since(now)
    puts start_time #<== ...here
    puts end_time   #<== and here
    @event = Event.new(start_time: start_time, end_time: end_time)
    render 'edit'
  end

  def now
    Time.zone.now
  end
end
0 голосов
/ 29 мая 2018

Установите вашу конфигурацию на :local и объявите ваш часовой пояс, и это сэкономит время с вашим часовым поясом (теперь не требуется метод).

Добавьте это в config / application.rb

confit.time_zone = "Moscow"
config.active_record.default_timezone = :local

Москва даст вам смещение +3, которое вам нужно, но вы можете выбрать свое местоположение или близкое к нему из этого списка .

Убедитесь, что вы удалили старые записипросто чтобы быть уверенным, затем создайте новый, и он должен быть установлен по вашему местному времени.

Вот соответствующая часть документов для локального флага.

...