Rails: удобный для даты формат даты для text_field - PullRequest
8 голосов
/ 22 октября 2011

У меня есть поле birth_date, которое хранится как значение datetime. Помощники по умолчанию для рельсовых форм выкладывают не слишком дружественный формат, например «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_ (оригинальное, безобразное форматирование) оно включает время. Сегодня пятница, и мое общее отсутствие знакомства с рельсами и рубиновыми объектами даты / времени заставляет меня чувствовать себя глупо.

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

Ответы [ 2 ]

10 голосов
/ 22 октября 2011

Если вы хотите пустую строку, если 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" %>

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

3 голосов
/ 22 октября 2011

Вы пробовали использовать вспомогательный метод построения форм date_select? Вы также можете использовать 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 UI. В настоящее время есть плагины для большинства JS-фреймворков.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...