Формат DateTime в текстовом поле в Rails - PullRequest
22 голосов
/ 14 сентября 2009

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

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

<%= text_field :my_object, :start_date %>

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

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

Doing

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

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

while evaluating nil.strftime

Ответы [ 7 ]

35 голосов
/ 20 января 2010

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

:value => (@object.start_date.blank? ? '' : @object.start_date.strftime('%m/%d/%Y'))
7 голосов
/ 14 сентября 2009

Я могу думать о трех направлениях:

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

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

3) Вы пытались сделать:

<%= text_field 
   :my_object,
   :start_date,
   :value => @my_object.try(:start_date).try(:strftime,'%m/%d/%Y') %>
4 голосов
/ 14 сентября 2009

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

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

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

2 голосов
/ 23 февраля 2011

В моем application_helper.rb я положил

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

В любом файле представления edit.html.erb с помощью инструмента выбора даты jQuery, который я затем использую:

<% if @activity.end_date? %> 
    <%= f.text_field :end_date, :value => nice_date_form(@activity.end_date) %>
<% else %>
    <%= f.text_field :end_date %>
<% end %>
1 голос
/ 21 октября 2014

Это может быть обработано DRYly на уровне модели с использованием предоставленного Rails варианта метода <attribute>_before_type_cast. 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, вы получаете форматирование «бесплатно».

0 голосов
/ 29 апреля 2013

В помощнике

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 - это вспомогательный рельс (I18n.l), который может быть специфичным для локали и может принимать формат. Примеры:

l(@activity.end_date, format: :short)
l(@activity.end_date, format: "%d-%m-%Y")
0 голосов
/ 14 сентября 2009

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

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