Rails: удобный формат даты для text_field

#ruby-on-rails #ruby #datetime

#ruby-on-rails #ruby #дата и время

Вопрос:

У меня есть поле birth_date, которое хранится как значение даты и времени. Помощники формы rails по умолчанию выдают не слишком удобный формат, например «2008-06-10 22:33:19.000000». Ниже приведен способ использования ванильных рельсов.

 <div class="field">
  <%= f.label :birth_date %>
  <%= f.text_field :birth_date, :size=>"20" %>
</div>
 

Как я могу просто применить формат? Я пробовал разные подходы, например, strftime должен работать, я думал. Но когда я пытаюсь выполнить следующее, я получаю сообщение об ошибке undefined method 'strftime' for nil:NilClass

 <div class="field">
  <%= f.label :birth_date %>
  <%= f.text_field :birth_date, :value=>f.object.birth_date.strftime('%m/%d/%Y'), :size=>"20" %>
</div>
 

Основываясь на некоторых других вопросах / ответах, я попробовал следующее. Он работает для ненулевых значений, но это уродливый код, и он не работает для пустых значений (на самом деле он показывает сегодняшнюю дату).

 <div class="field">
  <%= f.label :birth_date %>
  <%= f.text_field :birth_date, :value=> Time.parse(f.object.birth_date.to_s).strftime('%m/%d/%Y'), :size=>"20" %>
</div>
 

При воспроизведении кажется, что вывод f.object.birth_date обрабатывается как дата, а не как дата-время. Однако при отображении в text_field (исходное, уродливое форматирование) оно включает время. Сегодня пятница, и мое общее незнание форм rails и объектов даты / времени ruby заставляет меня чувствовать себя глупо.

Любой простой способ заставить мою форму ничего не отображать, если null / пустой, и дружественную дату в противном случае?

Ответ №1:

Если вам нужна пустая строка, если birth_date она пуста, вы должны просто проверить, что birth_date это не- nil заранее:

 <%= f.text_field :birth_date, :value => (f.object.birth_date.strftime('%m/%d/%Y') if f.object.birth_date), :size => "20" %>
 

Таким образом, когда значение birth_date равно nil , :value устанавливается значение nil .

Комментарии:

1. Спасибо, делает то, что мне нужно. Я был смущен, почему это не выдает ошибку при выполнении этого без проверки nil. Я думаю, что теперь я его отсортировал. Это делает то, что я хочу (хотя все еще кажется большим количеством кода).

2. Пожалуйста. Причина, по которой он выдает ошибку без nil проверки, заключается в том, что когда f.object.birth_date это nil произойдет, вы попытаетесь вызвать strftime его. Поскольку nil у него нет strftime метода, он выдает ошибку.

Ответ №2:

Вы пробовали использовать date_select вспомогательный метод form builder? Вы также можете использовать datetime_select , но, похоже, вы просто хотите работать с датой здесь.

 <div class="field">
  <%= f.label :birth_date %>
  <%= f.date_select :birth_date %>
</div>
 

Документы API находятся здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-date_select
Добавьте нужные вам параметры.

Я всегда использовал этот подход или селектор даты javascript, подобный этому, из пользовательского интерфейса jQuery. В наши дни существуют плагины для большинства фреймворков JS.

Если это ДОЛЖНО быть text_field, используйте библиотеку синтаксического анализа даты на человеческом языке, такую как chronic. Это будет работать, но потребует, чтобы вы где-то проанализировали входные данные из формы, прежде чем применять атрибут к вашему объекту.

Комментарии:

1. В конечном итоге я перейду к средству выбора даты. Спасибо, что поделились date_select, я раньше этим не пользовался. Однако мне это не нравится как интерфейс. Ввод даты в виде обычного текста кажется лучше. Я лично предпочитаю гибрид средства выбора с поддержкой javascript, который также позволяет вручную вводить дату (например, указанную вами опцию jquery).