Где мне хранить список опций выбора в Rails 3? - PullRequest
1 голос
/ 23 марта 2012

Использование Rails 3.1.3 и Ruby 1.9.3.

Я хочу предоставить пользователю список возможных форматов даты / времени.Выбор пользователя будет сохранен в таблице Users.Значения даты / времени затем форматируются с использованием функции I18n.localize.У меня на самом деле есть 10 форматов;вот в качестве примера первые два:

config / locales / datetime.en.yml

en:
  time:
    format_labels:
      mdyslash12: mm/dd/yyyy - hh:mm am (12-hour)
      mdyslash24: mm/dd/yyyy - hh:mm (24-hour)
    formats:
      mdyslash12: ! '%m/%d/%Y %I:%M%p'
      mdyslash24: ! '%m/%d/%Y %H:%M'

Мой вопрос: где хранить список возможныхформаты даты / времени.Я определил три варианта.

1.Перечислите параметры как ПОСТОЯННОЕ в модели:

app / models / user.rb

DATETIME_FORMATS = %w[mdyslash12 mdyslash24]
validates :datetime_format, :presence => true,
          :inclusion => { :in => DATETIME_FORMATS }

2.Создайте константу приложения и проверьте ее:

config / initializers / constants.rb

Rails.configuration.datetime_formats = "mdyslash12 mdyslash24"

app / models / user.rb

validates :datetime_format, :presence => true,
          :inclusion => { :in => Rails.application.config.datetime_formats.split(" ") }

3.Проверка напрямую по файлу локали:

app / models / user.rb

validates :datetime_format, :presence => true,
          :inclusion => { :in => (I18n.t 'time.format_labels').stringify_keys.keys }

Этот параметр использует новую для меня функцию: I18n.t 'time.format_labels' возвращаетхеш ВСЕХ ключей и значений из этой ветви файла локали.Ключи хеширования являются символами, поэтому для получения массива строк я вызываю stringify_keys, чтобы преобразовать символы в строки, а затем keys, чтобы получить только ключи (без значений).

Опция # 3СУХОЕ, что мне не нужно перечислять возможные значения в двух местах.Но не совсем корректно полагаться на файл локали для дискретного списка возможных форматов даты / времени.

Что бы вы порекомендовали?Один из этих вариантов?Что-то еще?

1 Ответ

3 голосов
/ 23 марта 2012

Для начала я бы выбрал вариант 1, поскольку он простой, понятный и довольно СУХОЙ. Я мог бы изменить рефакторинг на вариант 2, если бы мне понадобилась эта константа в другой модели.

Вариант 3 может вести себя по-разному в зависимости от локали, поэтому мне это не нравится. Если вы забудете указать метки формата в новой локали, ваш список выбора может оказаться пустым (или если в одной локали будет опечатка, это может занять больше времени, так как опечатка будет считаться действительной для этой локали). локали). Независимо от того, вероятно, это хорошая идея, чтобы протестировать это во всех ваших поддерживаемых локалях.

...