#31 Formatting Time
L'application qui suit montre une liste de tâches. Chaque tâche a un champ date appelé due_at
que nous
souhaitons afficher à coté du nom de la tâche.
Pour se faire, nous allons éditer le code de la vue dans /app/views/tasks/index.html.erb
. Ce code
parcourt chaque tâche et affiche son nom. Nous allons ajouter le temps due_at
à coté du nom de la tâche.
<ul id="taskList"> <% @tasks.each do |task| %> <li><strong><%= task.name %></strong> <%= task.due_at %></li> <% end %> </ul>
La vue index
avec le code pour afficher la date.
Formater les dates
La date est maintenant affichée mais le format est assez affreux; nous ne voulons pas vraiment la date et l'heure
sous cette forme ou que la zone soit affichée. La raison de cet affichage vient du fait que due_at
est un
objet Time
et le code de la vue appelle sa méthode to_s
. Nous avons toutefois le choix. Rails
étends la méthode to_s
pour nous fournir des options pour contrôler le format d'affichage. Nous allons
en essayer quelques un avec notre première date et voir quels formats elle renvoie.
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 |
Il y a de bonnes possibilités mais nous allons être pointilleux et décider que nous ne voulons en utiliser aucun de
ceux-là. Alors, comment définir notre propre format ? L'objet Time
de Ruby a une méthode appelée
strftime
qui nous permettra justement de faire ça. Il y plusieurs caractèresde contrôle du format, donc
nous allons regarder la documentation de Ruby pour voir ce qui est disponible. Exécutons la commande ri
Time.strftime
dans une console, ou regardons la page de documentation de l'API Ruby. Ainsi, on obtient
la liste des formats que nous pouvons utiliser.
Essayons de créer notre propre format. Nous allongs mettre à jour la partie de notre vue qui s'en occupe pour afficher la date avec notre propre format.
<%= task.due_at.strftime("due on %B %d at %I:%M %p") %></li>
Si on rafraichit notre page, on peut voir que les dates des tâches sont affichées comme on le souhaite.
Les dates s'affichent maintenant avec le bon format.
Raccourcir le code
Maintenant que nous affichons les dates avec le bon format, on peut voir que le code est peu élégant et difficilement
reeutilisable. On peut vouloir utiliser le même format à plusieurs endroits, donc on va refactoriser notre code pour
l'améliorer. Il y a plusieurs façons de faire : nous pourrions créer un helper ou nous pourrions ajouter une nouvelle
méthode dans le modèle Task
. Mais ce que nous allons préférer, c'est d'ajouter un nouveau format à la
méthode to_s
. Au lieu d'utiliser :long
, :short
ou :db
nous pouvons
créer notre propre format et lui donner un nom.
Nous allons d'abord faire le changement dans notre vue.
<%= task.due_at.to_s(:due_date) %></li>
Le format de la date nécessite d'être chargé avant le reste de l'application donc nous allons l'ajouter dans le
fichier environment.rb
. Les différents formats de date sont stockés dans un hash de la classe
Date
appelé TIME_FORMATS
. Tout ce qu'on a à faire c'est d'ajouter une nouvelle clé appelée
due_date
au hash avec la valeur de notre format. En bas de environment.rb
nous allons ajouter
la ligne suivante :
Time::DATE_FORMATS[:due_date] = "due on %B %d at %I:%M %p"
Après avoir fait cela, nous avons besoin de redémarrer notre application pour que le nouveau format soit pris en compte.
À présent, nos dates s'affichent au bon format et notre code est bien plus propre.