Как мога да използвам 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])

и няколко други логики след това. Не съм сигурен как да позволя на релсите да се справят с този допълнителен параметър при създаването на екземпляра на Active Record (ще го игнорира ли?) и също така не съм сигурен как след това да използвам local_client_time, което беше предадено през скрито поле, както в формат на дата, който Rails може да използва, за да зададе действително стойността на поле за дата verified_date

Забележка: Ще трябва да покажа полето за всички потребители, независимо дали са влезли или не, но това изглежда добре с скъпоценния камък local_time. Единственият проблем изглежда е с добавянето на поле за дата, което има компонент за време. След 20:00 EST се добавя като следващия ден и след това дисплеят отразява това. Друго поле („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