2009-09-14 16 views
22

Esiste un modo semplice per formattare la visualizzazione di un valore DateTime in una vista Rails?Formato DateTime nella casella di testo in Rails

Per esempio, se sto facendo qualcosa di simile:

<%= text_field :my_object, :start_date %> 

e vogliono solo per visualizzare la parte Data del :start_date (cioè voglio nascondere la parte di tempo), c'è un modo per formato la stringa :start_date all'interno della vista in modo che funzioni per la creazione di nuovi articoli my_object e l'aggiornamento di nuovi articoli my_object?

Solo una precisazione:

Facendo

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

lavora splendidamente quando l'oggetto esiste già (vale a dire sulla aggiornamenti voce), tuttavia, quando si crea un nuovo oggetto , dal momento che start_date sarà inizialmente essere nil, la vista genererà un errore

while evaluating nil.strftime 

risposta

35

Alcuni ottimi suggerimenti qui, tuttavia in quei casi in cui si desidera veramente che la data del campo di testo sia formattata in un modo specifico (ad esempio si sta integrando con un selettore di date javascript) e si ha a che fare con nils, penso semplicemente fare un tweak minore al tuo metodo esistente farebbe il trucco:

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

Ti manca un paren di chiusura alla fine, ma altrimenti è quello che ho fatto all'inizio. Alla fine ho deciso di inizializzare la 'start_date' alla data corrente nell'oggetto, in modo che' start_date' non sarebbe mai 'nil' in primo luogo. – jerhinesmith

+0

Even cleaner: value: (@ object.start_date.strftime ('% m /% d /% Y') a meno che @ object.start_date.blank?) –

+0

@ OleHenrikSkogstrøm nil non è uguale a una stringa vuota (che i datepicker Ho usato richiesto). Sicuramente usa un simile a meno che non funzioni se per te. –

4

Se si modulo R è legato ad un oggetto, (qualcosa come <% form_for(:object) do |f| %>) si dovrebbe usare <%= f.text_field :start_date, :value => f.object.start_date.to_s(:date_format) %>

allora è possibile registrare il :date_format in config/environment.rb

Non certo perché si vuole fare questo, ma spero che sia solo a scopo di presentazione.

+1

È principalmente per impedire a qualcuno di pensare di dover o dover inserire un tempo. Per la maggior parte degli utenti "2019-09-10 17:00:18" semplicemente non è amichevole. Preferisco semplicemente mostrare "09/10/2009" poiché la parte relativa al tempo è completamente inutile per quello che sto facendo. – jerhinesmith

+0

quindi dovresti usare l'helper select_date invece dell'input semplice – Eimantas

+0

Accetto, se è per selezionare una data, un calendario o un helper select_date sono approcci migliori – Yaraher

7

Mi vengono in mente tre modi:

1) Creazione di un nuovo metodo sul modello che formattare la data tuttavia è necessario che sia

2) Creazione di un metodo di supporto che avrebbe fatto lo stesso

3) hai provato a fare:

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

Numero 3 ha funzionato magnificamente per me. Grazie. – brad

2

Nel mio application_helper.rb ho messo

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

In ogni edit.html.erb file di vista con un datepicker jQuery ho quindi utilizzare:

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

Non verrà generato un errore se 'the_date' è nullo? – jerhinesmith

+0

@jerhinesmith Hai assolutamente ragione. Non l'ho provato correttamente. Ho cambiato il codice sopra per testare per nil. Potresti farlo anche nel modo in cui Dave Rapin lo ha fatto, in una bella copertina. –

+0

e se modificaste 'nice_date_form' in qualcosa come' return (the_date? The_date.strftime ('% d-% m-% Y'): '') '. Quindi, dovresti essere in grado di rimuovere il condizionale dalla vista. – jerhinesmith

0

In un aiutante

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

Poi nella vista

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

Ecco l è un aiutante rotaie (I18n.l) che può essere locale specifico e può prendere un formato. Esempi:

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

Questo può essere gestita seccamente al livello modello utilizzando le rotaie-forniti <attribute>_before_type_cast metodo variante. Rails utilizza già questo metodo per fare solo questo tipo di formattazione, quindi stiamo semplicemente sovrascrivendo il valore predefinito. Per esempio:

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

In questo modo, ovunque ci sia un campo di testo per il campo start_date MyModel # si ottiene la formattazione per "libero".

Problemi correlati