Как я могу использовать javascript для получения местного времени в форме рельсов?

Я использую гем local_time для отображения дат по местному времени пользователей, и он хорошо работает для уже добавленных дат, чтобы отображать их по моему местному времени.

У меня возникла проблема с добавлением новой даты, и я пытаюсь передать локальное время пользователей (и, следовательно, дату) через форму HTML. Я полагаю, что клиентское устройство имеет свое местное время, поэтому мне нужно его захватить.

Сейчас я пытаюсь добавить поле в свою форму, например:

= simple_form_for(@link)do |f|
...
= f.text_field :local_client_time, value: local_time("#{Time.now()}")

но это отображается

August 11, 2014 12:12pm" /> 

который не только искажен и фактически показывает (должен быть скрыт), но также показывает время UTC, на 5 часов опережая время моего браузера, которое находится на EST.

Как я могу передать локальное время пользователей в форме? (вероятно, js)?

Я также не уверен, как обработать его на контроллере. в настоящее время у меня есть

@link = Link.new(params[:link])

и еще несколько логик после этого. Я не уверен, как позволить rails обрабатывать этот дополнительный параметр при создании экземпляра Active Record (будет ли он игнорировать его?), и я также не уверен, как затем использовать local_client_time, который был передан через скрытое поле, как в формат даты, который рельсы могут использовать для фактической установки значения поля даты verified_date

Примечание. Мне нужно будет отобразить поле для всех пользователей, независимо от того, вошли они в систему или нет, но с гемом local_time это нормально. Единственная проблема, по-видимому, связана с добавлением поля даты, которое имеет компонент времени. После 20:00 по восточному поясному времени он добавляется как следующий день, а затем это отображается на дисплее. Другое поле («content_date») не имеет этих проблем, но для этого поля я просто использую f.text_field :content_date, id: 'datepicker', size: 10 и не использую специальную обработку в контроллере и поле даты в базе данных.

Оба поля даты выглядят одинаково:

| content_date   | date         | YES  |     | NULL    |                |
| verified_date  | date         | YES  |     | NULL    |                |

Мне также интересно, должно ли поле проверенной даты на самом деле быть датой и временем, чтобы обойти это. Дело в том, что я не забочусь о компоненте времени и никогда не использую и не отображаю его. Самый низкий уровень детализации в приложении для полей даты и времени — 1 день.


person Michael Durrant    schedule 11.08.2014    source источник
comment
...а также "#{Time.now()}" дает вам серверное время, а не клиентское время...   -  person Uri Agassi    schedule 11.08.2014
comment
Абсолютно. Вот почему нужно время клиента.   -  person Michael Durrant    schedule 11.08.2014
comment
Михаил, сейчас столкнулся с такой же проблемой. Как вы ее решили в конце концов?   -  person Sean Magyar    schedule 06.01.2016


Ответы (2)


Я думаю, этого будет достаточно:

= simple_form_for @link do |f|
...
  = f.text_field :local_client_time # This generates some unique ID I believe. Otherwise, define one yourself: id: <your-id>

# javascript
var localTime = new Date();
$('<ID generated through rails for your field>').val(localTime);

Rails получит этот дополнительный параметр на стороне сервера, если он является частью формы. Что вам нужно сделать, так это либо добавить параметр в класс модели Active Record (например, local_client_time), а затем убедиться, что он разрешен через ваш сильный фильтр параметров (если вы используете Rails 4).

Если у вас есть поле в вашей модели Active Record, то Link.new(params[:link]) должно помочь, в противном случае вам нужно определить метод (def local_client_time=) в вашей модели, который затем будет обрабатывать ввод.

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

person nicohvi    schedule 11.08.2014

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

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

После настройки вы можете сделать что-то вроде:

$(function() {
  var detected_zone = Temporal.detect();
  $('#user_time_zone').val(detected_zone.timezone.name);
});

После того, как вы установили часовой пояс, вы можете просто использовать Time.zone.now, чтобы получить местное время.

Взгляните на Railscasts о том, как отслеживать часовые пояса каждого отдельного пользователя в базе данных: ссылка

person olive_tree    schedule 11.08.2014