Подтвердить что ты не робот

Формат DateTime в текстовом поле в Rails

Есть ли простой способ отформатировать отображение значения DateTime в представлении Rails?

Например, если я делаю что-то вроде:

<%= text_field :my_object, :start_date %>

и хотите отобразить только часть даты :start_date (т.е. я хочу скрыть временную часть), есть ли способ форматировать строку :start_date внутри представления, чтобы она работала для создания новой my_object и обновить новые элементы my_object?

Просто уточнение:

Выполнение

<%= text_field 
       :my_object,
       :start_date,
       :value => @my_object.start_date.strftime('%m/%d/%Y') %>

прекрасно работает, когда объект уже существует (т.е. при обновлении элементов), однако при создании элемента new, поскольку start_date изначально будет равен нулю, представление будет вызывать ошибку

while evaluating nil.strftime
4b9b3361

Ответ 1

Некоторые замечательные предложения здесь, однако, в тех случаях, когда вы действительно хотите, чтобы ваше текстовое поле было отформатировано определенным образом (скажем, вы интегрируетесь с javascript date picker), и вы имеете дело с nils, я думаю, просто делая незначительная настройка вашего существующего метода сделала бы трюк:

:value => (@object.start_date.blank? ? '' : @object.start_date.strftime('%m/%d/%Y'))

Ответ 2

Я могу представить три способа:

1) Создание нового метода для модели, которая форматирует вашу дату, но вам нужно

2) Создание вспомогательного метода, который будет делать то же самое

3) Пробовали ли вы:

<%= text_field 
   :my_object,
   :start_date,
   :value => @my_object.try(:start_date).try(:strftime,'%m/%d/%Y') %>

Ответ 3

Если ваша форма привязана к объекту (например, <% form_for(:object) do |f| %>), вы должны использовать <%= f.text_field :start_date, :value => f.object.start_date.to_s(:date_format) %>

то вы можете зарегистрировать свой :date_format в config/environment.rb

Не уверен, почему вы хотите это сделать, но я надеюсь, что это только для презентаций.

Ответ 4

В моем приложении application_helper.rb я помещаю

def nice_date_form(the_date)
   return the_date.strftime('%d-%m-%Y')
end

В любом файле view.html.erb с помощью jQuery datepicker я использую:

<% if @activity.end_date? %> 
    <%= f.text_field :end_date, :value => nice_date_form(@activity.end_date) %>
<% else %>
    <%= f.text_field :end_date %>
<% end %>

Ответ 5

Это можно обрабатывать DRYly на уровне модели, используя вариант метода <attribute>_before_type_cast, предоставленный Rails. Rails уже использует этот метод для выполнения такого типа форматирования, поэтому мы просто перезаписываем значение по умолчанию. Например:

class MyModel
   def start_date_before_type_cast
      return unless self[:start_date]
      self[:start_date].strftime('%m/%d/%Y')
   end
end

Таким образом, в любом месте, где есть текстовое поле для поля MyModel # start_date, вы получаете форматирование для "свободного".

Ответ 6

если вы не хотите вводить дату в текстовое поле, но в поле выбора с меньшей вероятностью ошибки можете использовать ActionView:: Helpers:: DateHelper, select_date(). см. Доступ к переменным date() отправляет с помощника даты в рельсах здесь на SO о том, как обрабатывать возвращаемые значения.

Ответ 7

В помощнике

def l(value, options = {})
   return nil unless value.present?
   value = value.to_date if value.is_a? String
   super(value, options)
end

Тогда в представлении

<%= f.text_field :end_date, class: "datepicker" :value => l(@activity.end_date) %>

Здесь l является помощником rails (I18n.l), который может быть специфичным для локали и может принимать формат. Примеры:

l(@activity.end_date, format: :short)
l(@activity.end_date, format: "%d-%m-%Y")