#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).