2011-10-21 12 views
8

Ho un campo birth_date memorizzato come valore datetime. Le guide predefinite dei formatori di file sputano un formato non troppo amichevole, ad es. "2008-06-10 22: 33: 19.000000". Il sotto è il modo di binari di vaniglia.Rails: formato data human-friendly per text_field

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.text_field :birth_date, :size=>"20" %> 
</div> 

Come si può semplicemente applicare un formato? Ho provato vari approcci, per esempio dovrebbe funzionare strftime, ho pensato. Ma quando provo il seguente, ottengo un errore 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> 

Sulla base di alcune altre domande/risposte, ho provato quanto segue. Funziona con valori non nulli, ma è un codice brutto e non funziona con valori vuoti (in realtà mostra la data odierna).

<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> 

In suonare in giro, sembra che l'output f.object.birth_date è trattata come una data, piuttosto che datetime. Tuttavia, quando visualizzato nel campo testo (formattazione originale, brutta), include l'ora. È venerdì pomeriggio e la mia mancanza di familiarità con le forme delle rotaie e gli oggetti rubati data/ora mi sta facendo sentire sciocco.

Un modo semplice per ottenere che il mio modulo non visualizzi nulla se null/vuoto e una data amichevole altrimenti?

risposta

10

Se si desidera una stringa vuota se birth_date è vuota, si dovrebbe semplicemente controllare che birth_date è non nil anticipo:

<%= f.text_field :birth_date, :value => (f.object.birth_date.strftime('%m/%d/%Y') if f.object.birth_date), :size => "20" %> 

questo modo, quando birth_date è nil, :value viene impostata a nil.

+0

Grazie, fa quello che mi serve. Sono stato confuso perché questo non genera un errore quando lo fa senza il controllo nullo. Penso di averlo ordinato ora. Questo fa quello che voglio (anche se sembra ancora un sacco di codice). –

+0

Prego. Il motivo per cui genera un errore senza il controllo 'nil' è perché quando' f.object.birth_date' è 'nil', proverai a chiamare' strftime' su di esso. Poiché 'nil' non ha un metodo' strftime', genera l'errore. – Claw

3

Hai provato a utilizzare il metodo di supporto form builder date_select? Puoi anche usare datetime_select, ma sembra che tu voglia semplicemente lavorare con la data qui.

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.date_select :birth_date %> 
</div> 

la documentazione API sono qui: http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-date_select Aggiungi sulle opzioni necessarie.

Ho sempre usato questo approccio o un selettore di data javascript come this uno dall'interfaccia utente di jQuery. Ci sono plugin per la maggior parte dei framework JS in questi giorni.

Se DEVE essere un campo di testo, utilizzare una libreria di analisi della data in linguaggio umano come chronic. Funzionerà, ma richiederà di analizzare l'input dal modulo da qualche parte prima di applicare l'attributo al tuo oggetto.

+0

Alla fine andrò a un raccoglitore di date. Grazie per aver condiviso la data_select, non l'avevo mai usata prima. Tuttavia, non lo amo come un'interfaccia. Digitare una data di testo umano sembra migliore. Personalmente preferisco un ibrido di un selezionatore abilitato per javascript che ti permetta anche di digitare una data a mano (come l'opzione jquery che hai indicato). –