Le jour où Rails m’a trahi
Jusqu’à il y a 2 jours, je n’avais vécu que de belles expériences avec Ruby on Rails. Cette lune de miel s’est malheureusement terminée. J’adore toujours cette plate-forme, mais pour la première fois je peux également la critiquer…puisqu’elle m’en a fait baver pendant quelques heures.
Si vous avez l’intention de vous lancer dans le développement Web avec Ruby On Rails, voici un conseil que vous devriez suivre afin de vous éviter bien des maux de tête : Développez en anglais
Convention over Configuration
Une des grandes forces de Ruby on Rails est l’application du principe Convention Over Configuration. L’idée derrière le principe est que le mal réside à l’intérieur des fichiers de configuration. Par conséquent, on doit les éliminer afin de les remplacer par des conventions. Par exemple, si je nomme un modèle Produit, Rails va assumer que la table correspondante se nomme produits (en ce qui concerne les modèles et les tables, une des conventions veut que le nom d’une table soit la représentation plurielle du nom du modèle). Si j’ai bien fait mes devoirs et que je nomme effectivement ma table produits, la magie s’opère toute seule et je peux immédiatement commencer à utiliser mon modèle sans avoir eu à dire explicitement à Rails que le modèle Produit référait à la table produits.
Pensé par et pour des anglophones
Dans le cas du modèle Produit, la convention fonctionne puisque la règle au niveau du pluriel est la même qu’en anglais, c’est-à-dire qu’on ajoute simplement un s à la fin. Jusqu’à maintenant, j’avais toujours été chanceux en nommant mes tables en français puisque celles-ci étaient seulement constituées d’un mot. Mes problèmes ont commencés lorsque j’ai créé un modèle du nom de TrucCulinaire. Je m’attendais à ce que Rails assume que la table correspondante porte le nom de trucs_culinaires alors je l’ai nommée en conséquence. Erreur : Rails s’attendait à ce que j’aille une table du nom de truc_culinaires (notez qu’il n’y a pas de s à truc). En anglais, l’adjectif dans une expression est toujours placé devant le nom et ne s’accorde pas au pluriel. Par exemple, on dira “The blue cats” et non “The blues cats”.
Jusque là, pas de problème, me suis-je dit, puisque Rails permet d’écraser une convention par une configuration si la convention ne s’applique pas. Par contre, je ne vous avais pas mentionné que les trucs culinaires devaient être liés à des catégories (relation plusieurs à plusieurs). J’ai donc créé une table de jointure du nom de categories_trucs_culinaires. De son côté, Rails a préparé la magie pour essayer de lier des catégories avec des truc culinaires (ce n’est pas une erreur… j’ai volontairement enlevé le s à trucs afin d’entrer dans la tête de Rails). Pour se faire, il a assumé que ma table de jointure se nommait categories_truc_culinaires. C’est à ce moment que je me suis dit que si je commencais à écraser toutes les conventions de Rails, je ne respecterais pas la philosophie de ce framework (je lui ai d’ailleurs manqué de respect pendant 1 heure ou 2 afin d’écraser la convention… sans succès).
Qu’est-ce que j’ai fait pour régler le problème? J’aurais pu volontairement faire des fautes de français dans le nom de mes tables. Cependant, j’ai utilisé le truc de Dan pour chasser les pensées impures et je me suis giflé. Plutôt que de faire des erreurs volontaires dans le nom de mes tables, j’ai renommé ma table trucs_culinaires pour baking_tips, ma table categories_trucs_culinaires pour baking_tips_categories, ma clé étrangère truc_culinaire_id pour baking_tip_id et finalement j’ai renommé mon modèle TrucCulinaire pour BakingTip. Et voilà, le gentil Rails a alors tout compris.
La barre d’adresses… en anglais également?
Heureusement, non. Les noms de controlleurs et d’actions apparaîssant dans la barre d’adresses peuvent demeurer en français sans problème puisque contrairement aux modèles, ils ne sont jamais soumis à des conversions automatiques singulier-pluriel. Vous devrez par contre être constants quand vous nommerez la classe et le fichier de votre contrôleur. Par exemple, si vous créez un fichier trucs_culinaires.rb dans le répertoire “controllers”, le nom de la classe pour ce contrôleur devra être TrucsCulinairesController. De cette façon, vous pourrez avoir de belles adresses comme : http://lacuisine.com/trucs_culinaires/liste_amusante. Cela résultera cependant en une application franglaise.
Exemple :
class TrucsCulinairesController
… def liste_amusante
…… x = BakingTip.find(:all)
… end
end
Un peu bizarre…
Une demande spéciale
Je souhaite donc m’adresser aux développeurs de Rails afin qu’ils ajoutent, dans leur future version, un composant qui nous permettrait de spécifier un ensemble de conventions selon une langue. J’imagine que je ne suis pas le seul à demander quelque chose de la sorte.