Rails - дата и время выбираются в указанном часовом поясе - PullRequest
9 голосов
/ 06 июня 2011

Я работаю с приложением для веб-сайта концертного тура, где все время (время анонса, время начала продажи и время начала мероприятия) являются локальными для часового пояса каждого конкретного места.Я беру введенную пользователем дату / время, где это применимо, и запускаю before_filter, чтобы установить соответствующий часовой пояс, чтобы все сохранялось в базе данных в UTC.Для «новой» формы и для отображения времени в индексе и показе действий нет проблем вообще.Когда данные возвращаются из базы данных в представление, я использую in_time_zone для настройки в соответствии с конкретным местом.

Единственная проблема - в форме редактирования.Выбор даты / времени показывает данные в формате UTC.Когда я работаю над сайтом, я мысленно настраиваюсь, но для других это сбивает с толку.Я хотел бы сделать что-то вроде:

<%= f.datetime_select :start_datetime.in_time_zone(@event.time_zone) %>

Или в контроллере:

def edit
  @performance = Performance.find(params[:id])
  @event = @performance.event
  @performance.start_datetime = @performance.start_datetime.in_time_zone(@event.time_zone)
end

Тогда просто, <%= f.datetime_select :start_datetime %>.

К сожалению, я не нашел правильный способ сделать это.У вас есть идеи, которые стоит попробовать?

Большое спасибо.

Ответы [ 4 ]

3 голосов
/ 30 мая 2012

Вы можете использовать метод datetime_select по умолчанию, как показано ниже:

%br
= f.label :req_sess_start, "Session starts at"
= f.datetime_select(:req_sess_start, :start_year => 2010, :ampm => true, :default => 0.days.from_now.in_time_zone(@timezone))

Из-за показанного по умолчанию значения клиент будет предполагать, что время должно быть введено в его / ее местном часовом поясе, но ... это значение будет фактически в часовом поясе по умолчанию для вашего приложения (как указано в application.rb, и по умолчанию используется UTC). Таким образом, вам потребуется кодирование на стороне сервера, чтобы преобразовать его в правильное значение.

1 голос
/ 24 октября 2011

Я не уверен, что понимаю, что вы хотите сделать, но, поскольку вы храните @ event.time_zone, вы можете добавить

:default => start_time.in_time_zone(@event.time_zone)

в поле формы datetime_select.

0 голосов
/ 29 января 2012

Я только что заметил, что это старый пост, но: На вашем месте я бы использовал виртуальный атрибут для представления даты и времени места. Например, вы могли бы добавить к производительности атрибут с именем Adjust_start_time.

0 голосов
/ 26 сентября 2011

Как насчет этого:

# change PST to correct zone abbrev.
new_zone = ActiveSupport::TimeZone.new("PST")
@performance.start_datetime = @performance.start_datetime.in_time_zone(new_zone)
...