homeASCIIcasts

31: Formatage des dates 

(view original Railscast)

Other translations: En It

Other formats:

Written by Adrien Giboire (adriengiboire.com)

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.

Our list of tasks.

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

The dates are now shown but in the wrong format.

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.

Now our dates are displayed correctly.

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.