Cache Ruby on Rails et I18n

Lorsque l’on regarde les guides de mise en place du cache sur une application Rails, en général on se retrouve face à ce genre d’exemple :

<% cache(product) do %>
  <!-- here the markup for a single product -->
<% end %>

L’appel à cache permet de ne pas perdre de temps à recalculer le morceau de template pour un produit tant que celui-ci n’a pas été modifié.

Le souci est que si vous gérez une application multi-lingue, un bug se dissimule dans ce simple bout de code…

Le changement de langue ne marche plus ! Un coup c’est en français, un coup c’est en anglais !

Il faut en effet garder en tête que Rails ne va garder en mémoire le template calculé la première fois pour le produit donné.

Si ce dernier est affiché en anglais pour commencer, peu importe la langue de vos visiteurs, ce morceau de page sera affiché systématiquement en anglais jusqu’à la prochaine modification du produit.

La solution à ce problème est assez simple ; il vous suffit d’intégrer la locale courante à la clé de cache :

<% cache([I18n.locale, product]) do %>
  <!-- here the markup for a single product -->
<% end %>

Le morceau de vue relatif à un produit sera maintenant mis en cache pour chaque locale utilisée dans l’application.

Publié le 24 février 2016

Notre vision des choses vous correspond ? Vous avez envie de travailler avec nous ?