Рубрики
Без рубрики

Время локализации в приложении традиционных рельсов с моментом.

Узнайте, как локализовать время в приложении традиционных рельсов через клон Twitter и сделать это с легкостью, используя Moment.js.

Автор оригинала: Yitz Schaffer.

В Руби, момент времени, как правило, представлен как Время объект. В твиттере, как Приложение, например, время каждого твита будет закодирован как А Время Отказ Внутренние объекты этого типа представляют моменты вовремя как количество секунд с момента эпохи Unix (1 января 1970 года в полночь, UTC).

Использование Скоординированное универсальное время (UTC) дает нам стандарт для измерения времени против. Но, конечно, есть Задача пользовательского опыта, с которыми нам нужно иметь дело. Я использовал рельсы для создания WOODR, скелетной клон Twitter, чтобы проиллюстрировать точку. Вы можете играть в дому домой, клонируя репо И следуя инструкциям по установке в README.

Давайте посмотрим на временные шкарно-сгенерированные твиты … er, лает … Как показано, когда мы Git-checkout Наш первый коммит :

Контроллер

def index
  @barks = Bark.includes(:user).order('barked_at DESC').all
end

Вид

<% @barks.each do |b| %>
  
  • @<%= b.user.username %>
    <%= b.body %>
  • <% end %>
    Введите описание изображения здесь

    Наш бедный пользователь придется мысленно преобразовать UTC в их местное время, чтобы иметь смысл даты каждой коры, предполагая, что они даже знают о том, что означает «UTC».

    Что нам действительно нужно сделать, это локализовать Эти времена для пользователя. Хотя в рельсах можно сделать в рельсах, есть лучшее решение. Браузер уже осведомлен о часовой поясе пользователя! Библиотеки локализации боржеров в браузере работают наиболее естественно с помощью приложения, ориентированного на браузер, но все равно легко модернизировать на наших традиционных приложении Rails, чтобы преобразовать время UTC в местные времена.

    Отказ от ответственности: Для ясности код в этих примерах является минимальным минимумом, необходимым для демонстрации этих методов; Там нет ошибок обработки.

    Время локализации с моментом.

    Для этого мы включаем момент .js в нашем проекте через MomentJs-Rails GEM, объявляйте класс на каждой строке, который мы хотим преобразовать, и использовать момент для замены каждой строки. Проверьте Это совершается на Github Для получения полной информации.

    $('.timestring').each(function() {
      this.textContent = moment(this.textContent).format('lll');
    });
    
    Введите описание изображения здесь

    Тада! Сравните это с оригинальной версией выше.

    lll Формат Определяет читаемую человеческую форму даты на многообразности уровня 3, используя короткие слова, отсюда три строчные буквы «L».

    Стандартизация пользовательского ввода в UTC

    Флип-сторона заключается в том, что нам нужно преобразовать пользовательский ввод (предположительно локальное время) в UTC для хранения. Давайте снова будем использовать момент для этого. Ради примера, давайте предположим, что пользователь может указать время коры (на это фиксацию ):

    Введите описание изображения здесь

    Когда мы отправляем эту форму, время хранится в базе данных, как если бы пользователь ввел его в UTC: Ср, 03 февраля 2016 12:00:00 UTC +00: 00

    Нам нужно конвертировать в соответствии с нашим предположением, что пользователь ввел в местное время. С Это совершает , мы добавим скрытое поле в качестве «реального» коры, и используйте обработчик на событии «Отправить» нашей форме, чтобы захватить поставляемое пользователем значение, преобразуйте его и установите время UTC на скрытое поле.

    Вид

    Barked at
    <%= datetime_field_tag :raw_barked_at %>
    <%= f.hidden_field :barked_at %>
    

    Javascript

    $('.bark-form').submit(function() {
      var barkMoment = moment($('#raw_barked_at').val());
    
      if (barkMoment.isValid()) {
        $('#bark_barked_at').val(barkMoment.toISOString());
      }
    });
    

    На этот раз база данных имеет: Ср, 03 февраля 2016 17:00:00 UTC +00: 00

    Бинго!

    Бонус: локальный язык и формат

    Moment.js также имеет дополнительную поддержку полностью локализации времени с языками и форматами; Все, что вам нужно сделать, это Требуется каждый момент .js locale, который вы хотите сделать доступным Отказ

    Резюме

    С библиотекой, такими как Moment.js, легко преобразовать системное время на то, что пользователь будет полностью поймет, а также хранить поставляемое пользователем времена единым способом.