Validateur technique pour l'adaptation française du livre
Agile Web Development With Rails:
A Pragmatic Guide, à savoir
Ruby on Rails
dans sa version française, et créateur du portail Railsfrance.org (http://www.railsfrance.org),
Richard Piacentini vous propose de réaliser une petite application de création de blog avec Ruby on Rails.
D'autres parties seront ajoutées à ce tutoriel pour compléter cette application et la rendre totalement opérationnelle. Ainsi, n'hésitez pas à revenir régulièrement sur ce tutoriel.
Si vous souhaitez en savoir un peu plus sur cet outil avant de vous plonger dans la création de cette application, cliquez ici, sinon amusez-vous bien !
Pour les utilisateurs de Windows le plus simple est d'utiliser le Ruby One-Click Installer [1], la version utilisée pour ce tutoriel est la 1.8.4-16 preview3. Une fois l'installation de Ruby terminée, ouvrez un shell DOS et lancez la commande gem install rails --include-dependencies -r.
Pour les utilisateurs de Mac OS X 10.4 Ruby est déjà installé mais hélas la version 1.8.2 livrée par Apple pose des problèmes de fonctionnement avec Rails. Vous pouvez soit corriger le problème comme expliqué ici [2], soit installer Locomotive [3] ou encore télécharger ce script [4] qui installera tout le nécessaire.
Que vous soyez sous Windows ou Mac OS X installez aussi la librairie RedCloth car nous utiliserons Textile pour le formatage du corps de nos articles et commentaires. Il est fortement recommandé d'utiliser la version 3.0.3 avec Rails 1.0, ouvrez donc un terminal et tapez cette commande : gem install redcloth --version "3.0.3"
Pour cela il suffit de lancer la commande rails nom_de_l_application, et notre framework préféré se chargera de générer le squelette de l'application en plaçant judicieusement les fichiers qui la composent dans différents répertoires que nous explorerons au fur et à mesure de notre progression dans ce tutoriel.
Ouvrez une fenêtre DOS ou lancez votre shell favori, placez-vous à l'endroit
où vous souhaitez créer la structure de l'application et lancez cette commande :
rails demoblog
Si tout se passe bien vous devriez voir quelque chose dans ce genre :
Placez-vous maintenant dans le nouveau répertoire demoblog, si vous jetez un coup d'oeil sous le répertoire app/ vous verrez que Rails a déja créé les répertoires model, views et controllers où seront stockés les différents fichiers correspondants à nos modèles, vues et, rien de surprenant, contrôleurs. Un autre répertoire nommé helpers se trouve au même niveau mais nous y reviendrons en temps utile.
Explorons maintenant le répertoire script/, dans lequel vous trouverez
différents utilitaires. Celui qui nous intéresse pour le moment est le fichier nommé server.
Ce dernier permet de lancer un serveur web autonome (WEBrick ou lighttpd si il a été installé au préalable)
et de profiter de notre application nouvellement créée. Essayez donc en tapant la commande suivante :
ruby script/server
Ensuite lancez votre navigateur web et rendez-vous à l'adresse suivante :
http://127.0.0.1:3000/
Voici ce qui devrait s'afficher :

Figure 1 : Bienvenue à bord
Comme vous pouvez le constater Rails fait le maximum afin que nous puissions entrer au plus vite dans le vif du sujet. Le simple fait de taper deux commandes (rails demoblog et ruby script/server) a non seulement généré la structure de notre application mais a aussi mis en place un environnement nous permettant d'y accéder immédiatement via notre navigateur web !
J'entends d'ici les plus véhéments d'entre vous me rétorquer que tout ceci est bien beau mais que pour le moment nous sommes encore bien loin de pouvoir devenir les nouvelles étoiles de la planète blog, et qu'il serait peut être opportun de penser à utiliser une base de données pour y stocker les passionnants articles que nous ne manquerons pas d'écrire pour la postérité... C'est justement ce que nous allons faire dès la section suivante.
Munissez-vous de votre éditeur de texte favori et éditez le fichier config/database.yml. Vous remarquerez que Rails a déjà mis en pratique sa fameuse philosophie "Convention plutôt que configuration". En effet, le nom de la base de données est déjà pré-renseigné à partir du nom de notre application.
Les plus attentifs d'entre vous auront néanmoins remarqué qu'il n'y a pas une mais trois entrées, development:, production: et test:, correspondants à trois bases de données demoblog_development, demoblog_test et demoblog_production. Pendant la phase de développement de notre application, c'est la base demoblog_development qui sera utilisée.
La base demoblog_test quant à elle est considérée comme temporaire
et pourra être réinitialisée à chaque lancement de la batterie de tests que nous ne manquerons
pas d'écrire, en bons développeurs consciencieux que nous sommes. Nous verrons d'ailleurs plus loin que,
fidèle à son habitude, Rails devance une fois de plus nos attentes et nous a déjà préparé
toute une infrastructure de test.
Pour finir la base de données demoblog_production sera utilisée lorsque notre application
sera véritablement mise en ligne.
Si vous utilisez MySQL la seule chose qu'il vous reste à faire à ce niveau, c'est de renseigner les champs username et password de la section development:. Nous nous occuperons plus tard de la section test:. Maintenant, créez la base de données demoblog_development avec la commande en ligne mysql, phpMyAdmin, CocoaMySQL ou tout autre outil que vous utilisez habituellement.
Si vous utilisez SQLite, mettez en commentaire ou supprimez la section par défaut concernant MySQL, et renommez la section correspondant à votre version de SQLite en development: (et si ce n'est pas déjà fait installez le driver Ruby comme expliqué dans les commentaires du fichier config/database.yml). Il est inutile de créer la base de données SQLite à l'avance, Rails le fera automatiquement lorsque nous génèrerons le schéma de la base de données.
Pour les autres bases de données le mode opératoire est le même. Commentez ou supprimez la section par défaut concernant MySQL, renommez la section correspondant à votre version en development: et configurez la si besoin.
Une fois la configuration de la base de données terminée il est impératif de redémarrer le serveur web pour que les modifications soient prises en compte.
Tout d'abord nous allons générer un fichier schéma vide pour notre application,
tapez donc la commande suivante :
rake db_schema_dump
Si vous voyez apparaître ce message d'erreur :
C'est probablement parce-que vous n'utilisez pas SQLite et que vous n'avez pas encore créé la base de données... Relancez la commande une fois que ce sera fait.
Un nouveau fichier nommé schema.rb se trouve maintenant dans le répertoire db/, voici ce qu'il contient :
schema.rb(vide)
Nous allons le renseigner et définir notre schéma en utilisant le language Ruby.
Le code SQL compatible avec la base de données que nous avons configuré dans le fichier
db/database.yml, sera automatiquement généré par Rails au moment de l'importation.
Evidemment rien ne vous empêche de créer le schéma avec vos outils habituels
(phpMyAdmin, CocoaMySQL, etc.) mais ce serait beaucoup moins portable car lié au type de base de données
que vous utilisez au moment de la création.
Ne vous inquiétez pas, même si il s'agit de votre première rencontre avec Ruby, vous allez vous rendre compte que c'est extrêmement lisible. Vous n'avez qu'à recopier le fichier ci-dessous.
schema.rb(final)
Notre application de blog utilise deux tables de base de données, une pour stocker nos passionnants articles et l'autre pour les commentaires qui ne manqueront pas d'affluer de toutes parts. Ces tables sont nommées articles et commentaires, au pluriel et en minuscule, respectez bien cette convention car elle a son importance comme nous le verrons plus loin.
La table articles est composée d'un champ nommé titre de type chaine (:string)
limité à 100 caractères, et d'un autre champ nommé texte. Tout cela est très classique jusqu'ici.
Les trois autres champs néanmoins sont plus intéressants car directement liés à notre fameux
adage "Convention plutôt que configuration". En effet les deux champs de type datetime
nommés created_at et updated_at seront automatiquement renseignés
par Rails avec la date et l'heure de création ou de modification de l'enregistrement.
Le champ commentaires_count quant à lui va permettre à Rails de stocker le nombre
de commentaires rattachés à un article sans aucun effort de notre part, juste parce qu'il porte
le nom de la table commentaires suivi du suffixe _count (notez qu'il est important
que ce champ soit de type entier (integer) avec une valeur par défaut de zéro).
Dans la table commentaires le champ article_id est la clef externe qui va permettre de rattacher les commentaires à l'article auquel ils appartiennent. Là aussi, le nommage est important puisque ce champ porte le nom, au singulier, de la table à laquelle il fait référence suivi du suffixe _id.
La clef primaire de chacune des tables est générée par Rails et se nomme id par défaut. Il s'agit là d'une convention que vous pouvez outrepasser si besoin est.
Pour importer le schéma dans la base de données il nous suffit maintenant de taper la commande
suivante :
rake db_schema_import.
Nous pouvons maintenant passer à la section suivante.
Dans une application développée avec Rails le modèle représente la plupart du temps
une table de la base de données.
ActiveRecord est la couche de mise en correspondance objet-relationnel (ORM) de Rails,
son mode de fonctionnement est très proche du modèle ORM standard : les tables de la base
de données correspondent aux classes du modèle, les lignes des tables correspondent aux objets
et les colonnes aux attributs de ces objets. ActiveRecord se différencie néanmoins
des autres librairies ORM par l'utilisation de conventions de nommage (encore elles...)
qui permettent généralement de limiter la configuration.
Dans le cadre de cet article nous ne détaillerons pas le mode de fonctionnement d'ActiveRecord, mais si vous désirez aller plus loin sachez que, pour commencer, il est indispensable de comprendre les conventions utilisées pour la correspondance entre les noms des classes du modèle et les tables de la base de données. Vous trouverez une documentation abondante à ce sujet sur Internet, et pour les possesseurs du livre Ruby on Rails, vous trouverez des informations dans le chapitre 14 intitulé Les bases de ActiveRecord.
Par défaut ActiveRecord suppose que le nom de la table correspond à la forme plurielle du nom de la classe, et si la classe comporte des mots commençants par une lettre majuscule, ils seront transformés en minuscule et séparés par un tiret bas. Ainsi, la classe nommée Article est mise en correspondance avec la table nommée articles, la classe nommée ArticleAuteur avec la table article_auteurs et la classe RoleUtilisateur avec la table role_utilisateurs.
Sachez tout de même que l'algorithme utilisé pour déterminer la forme plurielle des noms des tables est simpliste et ne fonctionnera pas pour la majorité des formes irrégulières de la langue française. Néanmoins cela reste de la convention, et dans Rails toute convention peut être remplacée par de la configuration, en cas de besoin, vous pouvez donc désactiver ce mode de fonctionnement et fournir explicitement le nom de la table à associer à un modèle.
Refermons donc cette parenthèse conceptuelle et revenons-en à notre application,
il est temps désormais de créer les modèles correspondants à nos tables articles
et commentaires, ils seront donc conventionnellement nommés Article
et Commentaire.
Utilisons pour cela le script generate qui est un outil
très pratique que vous utiliserez souvent lors du développement de vos applications Rails.
ruby script/generate model Article
Vous pouvez remarquer que Rails encourage vraiment les bonnes pratiques car en plus du fichier modèle (app/models/article.rb), il met en place l'environnement qui nous permettra de tester efficacement les composants de notre future application. C'est dans le fichier test/unit/article_test.rb que nous pourrons écrire les tests unitaires portants sur notre modèle et le fichier de garniture test/fixtures/articles.yml permettra de spécifier le contenu initial qui sera chargé automatiquement dans la base de données de test.
De la même manière générons le modèle Commentaire :
ruby script/generate model Commentaire
Maintenant préparez-vous à atteindre des sommets de productivité, car en une seule ligne de commande nous allons générer un contrôleur pour notre modèle Article, les méthodes permettant de créer, récupérer, mettre à jour et supprimer des articles (le fameux CRUD en anglais : Create, Retrieve, Update, Delete) ainsi que les vues associées à ces actions.
Comble d'originalité, nous allons baptiser notre contrôleur Blog et la commande ci-dessous va générer tout l'échafaudage ("scaffold" en anglais) de notre application. D'ailleurs nous aurions très bien pu nous passer de générer préalablement le modèle Article et laisser le "scaffolding" s'en charger.
ruby script/generate scaffold Article Blog
Tapez l'url suivante dans votre navigateur web http://127.0.0.1:3000/blog et voici ce qui devrait s'afficher sous vos yeux ébahis :

Figure 2 : Liste articles
Et si vous cliquez sur le lien New article vous accèderez immédiatement au formulaire vous permettant de créer des articles :

Figure 3 : Formulaire de création
Impressionnant non ? Vous disposez en un temps record d'une interface web immédiatement fonctionnelle. Tous les champs définis dans notre table articles sont présents sur le formulaire, et vous pouvez déja créer, éditer ou supprimer des articles ! Essayez par vous-même et, vous allez vous rendre compte que notre application de Blog fonctionne réellement.
Si vous ouvrez maintenant le fichier app/controllers/blog_controller.rb, vous constaterez que Rails a généré tout le code nécessaire au bon fonctionnemment de notre interface, libre à nous ensuite de le modifier et de le faire évoluer en fonction de nos besoins. Rails nous fournit tous les éléments pour démarrer et être opérationnel le plus vite possible mais ce n'est pas une fin en soi, bien au contraire.
Propos recueillis par Laetitia Maraninchi.
Le livre :
L'interview de Laurent Julliard sur :
Les ressources en ligne :
Pour votre veille bibliographique :
Des services gratuits pour être informé des nouveautés qui vous intéressent...
Abonnez-vous !
eyrolles.com est un service de la Librairie Eyrolles - 61, boulevard Saint-Germain - 75005 Paris
© 1999-2009 Groupe Eyrolles