#31 Formatting Time
La seguente applicazione mostra una lista di task. Ogni task ha un campo datetime chiamato due_at
che vorremmo poter mostrare accanto al nome del task.
Per farlo, modifichiamo il codice della vista in /app/views/tasks/index.html.erb
. Questo codice itera sui task e ne mostra il nome. Aggiungiamo il campo due_at
accanto al nome del task.
<ul id="taskList"> <% @tasks.each do |task| %> <li><strong><%= task.name %></strong> <%= task.due_at %></li> <% end %> </ul>
La vista index con l’aggiunta del codice per mostrare la data di termine del task.
Formattare le date
<<<<<<< HEAD =======La data di termine task ora si vede, ma la formattazione è orrenda; non volgiamo certamente mostrare la data in quel modo, con tanto di ore minuti e secondi, nè tantomeno di time zone. Ciò invece avviene perchè due_at
è un oggetto di tipo Time
e la vista sta chiamando su di esso il metodo to_s
per mostrarlo. Abbiamo un paio di alternative da scegliere. Rails estende il metodo to_s
per fornirci alcune option di controllo sul formato di output. Proviamo alcune di queste col nostro primo task e vediamo che formati restituiscono:
Format | Result |
---|---|
Task.first.due_at.to_s |
2009-02-19 00:00:00 UTC |
Task.first.due_at.to_s(:long) |
February 19, 2009 00:00 |
Task.first.due_at.to_s(:short) |
19 Feb 00:00 |
Task.first.due_at.to_s(:db) |
2009-02-19 00:00:00 |
Ci sono un bel po’ di alternative, ma noi abbiamo gusti difficili e non ce ne va bene nessuna. Come possiamo definire un nostro formato personalizzato? L’oggetto Ruby Time
ha un metodo chiamato strftime
che ci permette di fare proprio ciò che vorremmo. Ci sono parecchi caratteri di controllo per il pattern di formato, per cui diamo u’occhiata alla documentazione Ruby per vedere cosa c’è a disposizione. Possiamo farlo digitando ri Time.strftime
da linea di comando, o dando un’occhiata all’ opportuna pagina di documentazione nelle API Rails. Entrambi i modi ci mostrano una lista di caratteri di formattazione che possiamo usare per il nostro pattern.
Proviamo a creare il nostro pattern di formattazione. Aggiorniamo la parte significativa della nostra vista per mostrare la data di termine del task nel formato che preferiamo.
<%= task.due_at.strftime("due on %B %d at %I:%M %p") %></li>
Quando aggiorniamo la pagina, vediamo che le date sono effettivamente mostrate come desideravamo.
<<<<<<< HEAD =======Le date di termine task ora mostrate nel formato corretto.
Riordiniamo il codice
Ora mostriamo le date secondo il formato che volevamo, ma il codice della vista è un po’ bruttino e non facilmente riusabile. Presumibilmente vorremmo usare lo stesso formato adottato qui anche in altri punti, per cui ora eseguiamo un piccolo refactoring per migliorare questo aspetto del nostro codice. Ci sono numerosi metodi in cui potremmo procedere nel refactoring: potremmo creare un metodo helper o potremmo aggiungere un nuovo metodo al modello Task
. La strada che prenderemo sarà quella di aggiungere un nuovo formato al metodo to_s
. Anzichè usare :long
, :short
o :db
, possiamo creare un nostro personale formato e dargli un nome.
Per prima cosa cambiamo il codice nella nostra vista index che mostra la date nel nostro formato:
<%= task.due_at.to_s(:due_date) %></li>
Il formato della data deve essere caricato prima del resto dell’applicazione, per cui lo aggiungiamo al file di configurazione environment.rb
. I vari formati di data sono salvati in un hash nella classe Date
chiamato TIME_FORMATS
, con le chiavi dell’hash che sono stringhe rappresentanti il formato. Tutto quello che dobbiamo fare è aggiungere una nuova chiave denominata due_date
all’hash con il valore ugale alla stringa del nostro formato. In fondo al contenuto del file environment.rb
aggiungiamo dunque la seguente riga:
Time::DATE_FORMATS[:due_date] = "due on %B %d at %I:%M %p"
Fatto ciò e salvato, dobbiamo riavviare l’applicazione in modo tale che il nostro formato sia preso. Se non riavviassimo, verrebbe mostrato il risultato del to_s
di default (e vedremmo lo stesso brutto formato iniziale!)
Dopo aver riavviato l’applicazione ed essere tornati indietro alla pagina di indice dei task, vediamo che il nostro nuovo formato di data sta ancora mostrando le date come volevamo noi ed il codice è ora molto più pulito.