Ma première application Ruby On Rails
J’ai atteint un stade agréable dans ma phase d’apprentissage RubyOnRails : je m’amuse enfin avec ce langage ! Oh, je ne sais pas encore tout faire, loin de là, et comme je le disais dans un précédent billet, la phase d’apprentissage n’est pas si courte que cela lorsque l’on vient de PHP ! Mais bon, j’en sais assez pour me permettre d’écrire ce nouveau petit didacticiel destinés à ceux qui veulent faire leur premier pas avec Rails et qui veulent bien le faire !
L’objectif de ce billet est de permettre à chacun de créer son premier site Internet (ou plutôt sa première application) avec Ruby On Rails, depuis l’écriture de la première ligne de code jusqu’à sa mise en ligne. Pour cela il nous faut un sujet, on pourrait prendre l’exemple d’un blog mais certains l’on déjà fait, on pourrait essayer de faire une petite boutique de ecommerce mais d’autres en ont déjà fait livre. En fait, on pourrait “presque” tout faire… mais le but n’est vraiment pas de coder une application complexe, il faut que ce soit simple à écrire et à comprendre !
Je tranche donc, ce sera une petite application de gestion de CDs, basique : ajout de CD, édition, suppression, consultation. C’est pas le graal mais c’est pas le but. Faut que ce soit à la porté de tout le monde afin d’introduire Ruby On Rails.
Préparation du développement.
Avant de coder quoi que ce soit, il nous faut préparer l’environnement de développement. Cet environnement se compose de 2 parties : le moteur (Ruby, Rails, WEBrick ou Mongrel) et l’éditeur (Eclipse, Radrails, TextMate, Vim, et j’en passe…). Il est possible d’installer cet environnement sous Linux, OSX ou encore Windows. Je ne décrirais pas ici comment faire pour installer tout cela mais je vais vous donner les liens pour passer cette étape avec succès.
- Linux (Ubuntu) : Installer Ruby On Rails & Eclipse (Radrails)
- OSX : HowtoInstallOnOSXTiger et quelques mots sur TextMate, un éditeur adulé par les inconditionnels de la pomme.
- Windows : Je ne sais pas trop comment ça se passe sous cet environnement, mais vous pouvez jeter un oeil sur InstantRails (ici en français)
- (Si vous connaissez d’autres types d’installations ou d’autres bon tutos, faites moi en part dans les commentaires, je les noterai ci dessous !)
- Windows par Aurélien : Utilisation de WAMP5, la procédure est décrite dans son commentaire en bas de page.
- __Windows avec EasyRails : Je n’ai pas testé mais cela me semble très prometteur. Le but de ce projet étant d’amener du monde vers Rails, je ne peux qu’aprouver ! (Easyrails)
Petite note personnelle : Je suis sous Ubuntu Linux et j’utilise Radrails en tant que plugin pour Eclipse pour développer, Radrails permet de faire certaines actions grâce à une interface, dans le petit tutorial ci dessous, j’utiliserai directement les commandes à saisir sur votre console (Linux ou Windows)
Création de l’application mesCDs !
On ne peut parler de Rails sans dire 2 mots du fameux Modèle-Vue-Contrôleur (MVC), c’est un patron de conception (design pattern) sur lequel est basé le framework Rails. Pour résumer très rapidement, rails vous permettra donc de mettre en oeuvre chacun des principes de ce MVC. Les modèles seront votre interface de communication avec la base de donnée, les contrôleurs seront le lieux ou vous écrirez vos actions et enfin les vues seront destinées à présenter l’information…
Ce n’est pas grave si tout n’est pas encore clair, le mieux c’est de se lancer !
Création de l’arborescence Rails du projet.
La première étape d’un nouveau projet rubyonrails est la création de ce projet, une commande vous permettra de créer l’arborescence de base et générera certains fichiers indispensables.
# rails mesCDs
Une liste de dossier et de fichiers seront donc crées dans le répertoire mesCDs. Vous pouvez faire un petit tour dans cette arborescence afin de vous familiariser avec le nom des répertoires. Vous trouverez notamment un répertoire ‘app’ dans lequel vous travaillerez le plus souvent, lui même contient 4 sous répertoires dont le nom devrait vous rappeler quelquechose… On retrouve en effet un répertoire pour chaque brique du MVC (models, views, controllers) et un 4ème répertoire appelé “helpers”. Ce dernier contiendra des fichiers qui pourront être apparentés à des bibliothèques de fonctions… On y reviendra plus tard !
Avant d’aller plus loin et pour vous prouver qu’un projet Rails est réellement rapide à mettre en oeuvre, nous allons entrer dans le répertoire mesCD et lancer la commande suivante :
# script/server
Vous devriez avoir un message dans ce style parmis d’autre: “Rails application starting on http://0.0.0.0:3000”. Cela veut dire que votre application Rails est lancée et qu’elle est disponible pour test à travers votre navigateur à l’adresse http://0.0.0.0:3000. (0.0.0.0 étant le localhost). Vous venez de lancer un serveur Mongrel, si vous interrompez ensuite ce script vous coupez le serveur Mongrel. Rendez-vous à l’url indiquée (http://0.0.0.0:3000), vous aurez droit au joli “Welcome aboard” : cet écran vous explique comment débuter votre projet. Il est assez minimaliste mais à tout de même le mérite de nous indiquer quelle est notre prochaine étape : la base de donnée.
Connexion d’une base MySQL
Rails est conçu pour développer des applications nécessitant une base de donnée, aujourd’hui c’est quasiment le “sine qua non” des applications modernes. Cependant Rails peut fonctionner sans, je vous laisserai le découvrir par vous même au fur et à mesure de votre apprentissage !
Revenons donc à nos moutons… Il nous faut créer une base de donnée et indiquer à notre nouvelle application comment l’utiliser. MySQL étant le type de base le plus largement utilisé dans la création d’application web nous allons donc travailler avec ! (Il faut savoir que Rails peut fonctionner avec d’autres bases de données relationnelles.)
Ouvrez donc un prompt MySQL (amis windowsiens débrouillez vous avec phpmyadmin ou autre gadget
) et créez votre base :
# mysql> create database mescds;
Créez ensuite un couple user/pass pour accéder à votre base de donnée :
# mysql> grant all on mescds.* to 'user' identified by 'password';
La base de données créée et vos informations bien en tête, nous allons maintenant renseigner le fichier de configuration associé. (config/database.yml) Editez le et compléter la partie correspondante :
development:
adapter: mysql
database: mescds
username: user
password: password
host: localhost
Nous n’avons touché que la configuration correspondant à la base de développement car Rails fonctionne par défaut en mode ‘development’, ce mode sera changé lors du passage en production, nous le verrons plus tard lorsque nous mettrons en ligne notre future application… L’application devrait maintenant être en relation avec votre base de donnée, vous pouvez alors effacer le fichier correspondant à la page d’accueil :
# rm public/index.html
et relancer votre serveur Mongrel (interruption du script puis commande script/server à nouveau), la page http://localhost:3000 devrait alors vous afficher une erreur “Routing Error”, rien d’alarmant, il faut maintenant coder un peu…
Création du modèle “cds”
Dans une application classique “assez propre”, pour gérer une base de donnée de CDs, la première étape assez longue est de créer une table “CDs” puis d’écrire une classe permettant d’exécuter des actions simples telles que ajouter un champs, supprimer un champs, mettre à jour un champs, afficher les champs, etc. Cette étape est grandement simplifiée dans Rails, ActiveRecords (une des parties de Rails) nous fournit ce que l’on appelle une abstraction de la base de donnée.
Voyons maintenant comment l’utiliser. Créons d’abord notre modèle “cd”
# script/generate model cd
Si l’on inspecte un peu le retour de cette commande, on observe qu’elle crée 4 fichiers (et un répertoire) :
create app/models/cd.rb
create test/unit/cd_test.rb
create test/fixtures/cds.yml
create db/migrate/001_create_cds.rb
Le premier “cd.rb” est notre modèle (gardez en tête le MVC !), le second “cd_test.rb” est un fichier permettant de tester l’application (je ne m’étendrai pas sur cette partie que je ne maîtrise pas bien), le troisième “cds.yml” est un fichier dans lequel on peut renseigner un jeu de tests (des données fictives de l’application), le dernier “001_create_cds.rb” est le fichier indiquant comment créer la table “cd” en base de donnée, et c’est d’ailleurs par là que nous allons commencer.
Arrêtons nous une minute, pour réfléchir à notre table CDs : un cd peut être défini par un titre, un auteur et une brève description par exemple. Nous allons donc indiquer ce que nous voulons dans le fichier “db/migrate/001_create_cds.rb” que je vous laisse lire car il est assez explicite :
class CreateCds < ActiveRecord::Migration
def self.up
create_table :cds do |t|
t.column :title, :string
t.column :author, :string
t.column :description, :string
end
end
def self.down
drop_table :cds
end
end
Et pour finir nous allons dire à notre application qu’il faut “migrer” c’est à dire changer de version (ou encore exécuter 001_create_cds.rb), toujours dans votre console à la racine de votre application tappez :
# rake db:migrate
Et la magie va s’opérer : la table “cds” va être crée automatiquement dans MySQL, concrètement ce qui se passe c’est que la commande rake db:migrate si elle est appelée sans paramètre va invoquer les méthodes self.up de chaque classe de Migration (chaque fichier du répertoire db/migrate/). En spécifiant un paramètre comme le numéro de la migration vers laquelle nous voulons aller, Rails fera en sorte de revenir à la version demandée en invoquant les méthodes self.down impliquées… subtil mécanisme, peut être pas évident à saisir dans un premier temps mais terriblement efficace !
Prenons un example, la spécification faites en début de projet d’un CD ne me plaît plus, il me manque des informations cruciales telles que l’année de parution ou encore la date d’achat si je veux garder un historique des achats de mes CDs… Nous allons créer une nouvelle “migration” pour notre modèle :
# script/generate migration add_some_dates
Le script génère le fichier db/migrate/002_add_some_dates.rb qu’il ne nous reste plus qu’a compléter avec les instruction d’ajout de colonne en self.up et les instruction de suppression de colonne en self.down :
class AddSomeDates < ActiveRecord::Migration
def self.up
add_column :cds, :year, :integer
add_column :cds, :buy_date, :datetime
end
def self.down
remove_column :cds, :year
remove_column :cds, :buy_date
end
end
Il suffit d’exécuter à nouveau :
# rake db:migrate
pour mettre la base de donnée à jour avec les nouvelles informations…
Maintenant que je vous ai mis l’eau à la bouche avec ces premières ligne de code, passons à la vitesse supérieure !
Génération automatique de l’application !
Vous avez bien lu le titre… et si vous vous intéressez un tant soi peu à Rails vous avez du voir quelques démos et vous savez que c’est possible… mais comment ? Nous allons le voir maintenant.
La génération automatique de l’application (mécanisme appelé scaffold) s’appuie sur votre modèle pour générer les méthodes du contrôleur et la (ou les) vue(s) dynamiquement. En utilisant cette méthode nous n’abordons pas l’écriture complète d’un “controller” et d’une “view”. (Parcequ’il est intéressant de voir ce mécanisme de scaffold mais aussi parcequ’il ne faut pas perdre de vue l’aspect “VC” du MVC nous y reviendrons plus en détail par la suite.)
Scaffold…
Le scaffold s’appuie donc sur un modèle. En fait le principe est d’indiquer dans le fichier du contrôleur quel est le nom de notre modèle. Il faut donc commencer par générer un contôleur pour nos CDs que nous appellerons simplement “cd” :
# script/generate controler cd
Encore une fois Rails va créer 3 nouveaux fichier dont app/controllers/cd_controller.rb qui nous intéresse. C’est dans ce fichier (notre contrôleur) que nous allons “décrire” le scaffold. Cela se fait de la manière suivante :
class CdController < ApplicationController
scaffold :cd
end
Et c’est fini ! En fait la ligne “scaffold :cd” indique au contrôleur CdController d’utiliser le modèle “cd”.
Il vous suffit ensuite de vous rendre sur votre site : http://localhost:3000/cd… et si la magie à bien opéré vous pourrez dès à présent voir votre liste de CD, en ajouter, en supprimer ou encore en éditer !
Bon alors c’est bien beau mais… jusque là, on a écrit aucune ligne de code (ou presque) pour faire tout ça. Alors, comment va t’on faire pour pouvoir modifier cette petite application ?
Nous allons simplement dire à Rails de générer le code une bonne fois pour toute au lieu de le générer dynamiquement à chaque appel…
Générer le code correspondant au scaffold !
Je ne dirai qu’une seule chose :
# script/generate scaffold cd cd
Notre contrôleur portant le même nom que notre modèle, la syntaxe peut paraître floue. La voila en plus clair :
# script/generate scaffold ModelName ControllerName
La commande devrait vous demander de remplacer des fichiers existant, il faut bien entendu confirmer. Ceci fait, si vous vous rendez à l’adresse http://localhost:3000/cd vous verrez que rien n’a changé. Pourtant tout le code a été généré, pour vous en rendre compte éditer votre contrôleur (app/controllers/cd_controller.rb).
class CdController < ApplicationController
def index
list
render :action => 'list'
end
...
Et oui ! Il est tout plein de méthodes pour ajouter, supprimer, éditer ou encore lister vos CD… Vous pouvez vous attarder un peu sur ce fichier et essayer d’en lire le code. Même si il ne vous parle pas trop, cela vous habituera un peu à la syntaxe. Ruby (et donc Rails) est connu pour être un code relativement facile à lire.
Tant que vous y êtes, faites un petit tour dans les autres répertoires, notamment celui des vues (app/views). Vous verrez que les vues sont en fait les fichiers contenant le code HTML servant à la présentation des informations. Le répertoire app/views/cd contient toutes les vues concernant le contrôleur “cd”, le répertoire app/views/layout contient lui des “patrons de présentation”. En fait une vue sera affichée à l’intérieur d’un layout. Un layout peut donc être utilisé pour concevoir la structure d’affichage des informations.
Dans notre exemple, le layout cd.rhtml est utilisé par toutes les vues. Ce comportement est automatique car le layout porte le nom du contrôleur, mais attention ce comportement n’est pas non plus rigide, il est possible d’indiquer à un contrôleur d’utiliser un layout différent que celui par défaut. C’est utile par exemple lorsque l’ensemble de notre application doit être présenté de la même façon. C’est le cas par exemple d’une grande partie des sites Internet qui quels que soit la page garde toujours une structure avec un bandeau, un menu et un contenu…
Avant d’aller plus loin nous allons régler un “pseudo” problème : l’erreur sur la page d’accueil. Maintenant que nous avons un semblant d’application, ce serait pas mal que lorsqu’on appelle directement notre site (http://localhost:3000) la liste des CDs arrive en page d’accueil. Ceci peut être résolu par les routes. Editez donc le fichier config/routes.rb :
Décommentez la ligne suivante :
#map.connect '', :controller => "welcome"
et modifier la comme suit :
map.connect '', :controller => "cd"
En vous rendant sur http://localhost:3000 vous devriez normalement accéder directement à votre application. Ce fichier routes.rb permet de définir des “routes” pour votre application, je n’en dirai pas plus pour l’instant et je vous invite à lire les commentaires de ce fichier pour en apprendre un peu plus.
Je veux des commentaires !
Sur l’application de gestion de CDs… les commentaires. Pas sur mon article ! Quoique…
Bref, que serait une application moderne sans la possibilité pour les utilisateurs de commenter tout ce qu’ils cliquent ? … D’accord, d’accord… le but de l’article n’est pas de faire du web2 mais bon, tant qu’a faire, on utilise un langage qui fait “class” alors pourquoi ne pas y ajouter quelques petites fonctionnalités de ce qu’on appelle plus sérieusement le “user generated content” !
Nous aborderons donc dans cette partie la création du modèle “comment”, son lien avec le modèle “cd”, la modification du contrôleur CD et des vues existantes, et enfin nous verrons comment ajouter une pincée d’Ajax dans la machine…
Le modèle commentaire.
# script/generate model comment
Nous nous arrêterons là pour les générations ce coup ci. Le reste sera fait à la mano
Commençons par décrire notre table commentaire dans le fichier de migration (db/migrate/003_create_comments.rb)
class CreateComments < ActiveRecord::Migration
def self.up
create_table :comments do |t|
t.column :content, :text
t.column :author, :string
t.column :email, :string
t.column :cd_id, :integer, :null => false
end
end
def self.down
drop_table :comments
end
end
Notez qu’il est nécessaire d’indiquer le nom de la colonne qui servira à faire la relation entre les commentaires et les CDs ( :cd_id ).
# rake db:migrate
Et votre table sera crée !
Lien avec le modèle CD
Il faut maintenant indiquer à notre application qu’il existe un lien entre les tables “cd” et “commentaires”. Ce lien sera indiqué dans les modèles respectifs :
(app/models/cd.rb)
class Cd < ActiveRecord::Base
has_many :comments, :dependent => :destroy
end
On indique ici qu’un Cd “a beaucoup” de commentaires et aussi que si on supprime un Cd, alors les commentaires associés seront aussi supprimés ! (merci Rénald.) Cette dépendance est ici spécifiée sur la couche application, on pourrait aussi l’ajouter au niveau des données (MySQL) à travers une relation (FOREIGN KEY / ON DELETE CASCADE) pour être certain de l’intégrité des données lors de la suppression.
(app/models/comment.rb)
class Comment < ActiveRecord::Base
belongs_to :cd
end
Et ici on dit qu’un commentaire “appartient à” un CD !
Notre application sait maintenant qu’une relation de type 0..N uni nos 2 tables.
Listing et formulaire de création de commentaire :
Les commentaires et leur formulaire d’ajout se trouvent classiquement sur la fiche CD, éditons donc la vue correspondante (app/views/cd/show.rhtml) et ajoutons y nos 2 parties :
<h1>Fiche CD</h1>
<h2>Contenu</h2>
<% for column in Cd.content_columns %>
<p>
<b><%= column.human_name %>:</b> <%=h @cd.send(column.name) %>
</p>
<% end %>
<%= link_to 'Edit', :action => 'edit', :id => @cd %> |
<%= link_to 'Back', :action => 'list' %>
<h2>Commentaires</h2>
<% for comment in @cd.comments %>
<h3><%=h comment.author%> - <%=h comment.email%></h3>
<p><%=comment.content%></p>
<% end %>
<h3>Ajouter un commentaire :</h3>
<%= form_tag :action => "add_comment", :id=>@cd %>
Auteur : <%= text_field "comment", "author" %><br />
Email : <%= text_field "comment", "email" %><br />
<%= text_area "comment", "content" %><br />
<%= submit_tag "Valider" %>
</form>
On a donc une boucle “for” qui parcours le contenu des commentaires associés au CD en cours (@cd.comments). Pour réaliser le formulaire on utilise des “helpers”, ce sont des méthodes qui nous aide à générer le code HTML correspondant. Par exemple le helper “formtag” envoie les résultats du formulaire sur l’action “addcomment” du contrôleur “cd” en lui passant comme paramètre le CD en cours.
C’est bien beau d’avoir le formulaire mais il nous faut maintenant écrire une méthode pour pouvoir enregistrer un commentaire, pour cela nous allons éditer le fichier app/controller/cd_controller.rb et ajouter la méthode add_comment :
class CdController < ApplicationController
...
def add_comment
Cd.find(params[:id]).comments.create(params[:comment])
flash[:notice] = "Commentaire ajouté !"
redirect_to :action => "show", :id => params[:id]
end
end
Cette méthode reçoit donc les résultats du formulaire. “Cd.find(params[:id])” accède à l’objet CD dont l’id a été envoyé, “comments” accède à la collection de commentaires de cet objet CD et “create” réalise une action sur cette collection en y ajoutant l’objet “:comment” reçu par en paramètre. Enfin la méthode add_comment nous renvoie sur la méthode “show” avec l’id en cours afin de re-afficher la fiche CD.
Quelques vérifications…
Ou plutôt devrais-je dire “validations”… En effet nous allons vérifier que les informations saisie à travers les formulaires sont bien celles que nous attendons. Pour cela Rails nous fournit un mécanisme très performant de validations.
Reprenons un instant le formulaire d’ajout de CDs, il serait intéressant de vérifier lors d’un ajout que les champs Titre et Auteurs soient systématiquement présents. Pour faire cela éditons le fichier app/models/cd.rb comme ci dessous :
class Cd < ActiveRecord::Base
has_many :comments
validates_presence_of :title, :author
end
… et la pincée d’Ajax !
Personnellement, j’aime lorsque Ajax est utilisé à bon escient, on peut dire alors qu’il est non intrusif pour l’utilisateur. Ainsi en général je me fixe comme règle d’utiliser ajax que si cela apporte un réel plus à l’utilisateur. Dans tous les cas il faut qu’un visiteur sans Javascript puisse quand même effectuer l’action demandée.
Sachant cela, nous pouvons nous lancer. Nous allons permettre à nos visiteurs de publier un commentaire sans impliquer le rechargement total de la page, c’est presque inutile/intrusif mais c’est pour l’exemple
(J’avais promis qu’on aurait un peu d’ajax dans notre première appli Rails !)
Il faut d’abord commencer par alléger un peu notre fichier affichant le CD et les commentaires. Pour cela nous allons utiliser le système des “partial”. Ces partial sont en fait des vues partielles, ainsi cela nous permettra de mettre ce qui concerne l’affichage d’un seul commentaire dans un fichier à part et de l’inclure dans notre fichier principal.
Créons donc notre fichier app/views/cd/_comment.rhtml (le “_” a son importance !) et mettons y ce qui concerne notre commentaire (ce qu’il y avait donc dans la boucle for de la page show.rhtml)
<h3><%=h comment.author%> - <%=h comment.email%></h3>
<p><%= comment.content%></p>
Ainsi notre fichier app/views/cd/show.rhtml devient (dans la partie concernant les commentaires) :
...
<h2>Commentaires</h2>
<div id="comments">
<%= render(:partial => "comment", :collection => @cd.comments) %>
</div>
<h3>Ajouter un commentaire :</h3>
...
Le partial “_comment.rhtml” sera donc appelé pour chaque occurrence de la collection “@cd.comments” en mettant le résultat dans une variable du nom du partial (comment). Intéressons nous maintenant au formulaire d’ajout de commentaire. Il faut lui dire d’envoyer ses données grâce à l’objet XmlHttpRequest, cela se fait de façon transparente de cette manière :
<h3>Ajouter un commentaire :</h3>
<%= form_remote_tag(:url => {:controller=> :cd, :action => :add_comment, :id => @cd }, :update => 'comments', :position=> :bottom) %>
Auteur : <%= text_field "comment", "author" %><br />
Email : <%= text_field "comment", "email" %><br />
<%= text_area "comment", "content","cols" => 60, "rows" => 5 %><br />
<%= submit_tag "Valider" %>
</form>
Le helper form_remote_tag va envoyer les résultats du formulaires sur la même action (:add_comment), lorsque le formulaire sera exécuté l’élément ‘comments’ sera mis à jour en insérant le contenu mis à jour en bas (:position=> :bottom).
Avant de tester il va falloir modifier un peu la méthode :add_comment afin qu’elle gère correctement notre formulaire Ajax :
def add_comment
@comment=Cd.find(params[:id]).comments.create(params[:comment])
if request.xhr?
render (:partial => "comment", :locals => { :comment => @comment } )
else
redirect_to :action => "show", :id => params[:id]
end
end
Le test request.xhr vérifie si notre requête a été transmise par l’objet XmlHttpRequest ou de façon plus classique, dans le cas d’un fonctionnement Ajax nous indiquons de n’afficher que le partial, dans le cas contraire toute l’action “show” est exécutée.
Update : Enfin pour que le javascript fonctionne correctement il faut ajouter au fichier app/views/layouts/cd.rhtml la ligne suivante entre les balises head :
</head>
...
<%= javascript_include_tag :defaults %>
</head>
Passage en production.
Considérons notre application comme terminée. Elle est certe moche et sans intérêt majeur mais mettons nous dans l’optique de la publier sur un hébergement Rails. Avant d’entamer les recherches pour un hébergeur nous allons passer en mode “production”. Ce mode doit être utilisé lorsque l’application est terminée.
Il faut donc définir la configuration du mode production dans le fichier de base de donnée (config/database.yml) :
production:
adapter: mysql
database: mescds
username: user
password: password
host: localhost
Enfin il faut changer le mode actif dans le fichier “config/environment.rb”, pour cela il suffit de décommenter la 5ème ligne :
ENV['RAILS_ENV'] ||= 'production'
Normalement il faudrait redémarrer le serveur, mais sur votre environnement cela ne sert à rien il me semble car Rails force le mode “development”. Ce n’est pas grave, les fichiers sont prêts à être envoyer en ligne…
Mise en Ligne !
Changement de dernière minute
Cette partie devait être l’une des plus intéressante de ce billet car c’est un sujet peu abordé dans le monde “Rails” où les hébergeurs ne sont pas encore très nombreux mais voilà… j’avais prévu de faire cette partie avec HostingRails qui proposait un hébergement gratuit mais apparemment c’est fini, ils ne proposent plus de formule gratuite… (C’est tout récent, quand j’ai commencé l’écriture de ce billet il ya plusieurs jours cela existait encore…)
Ils ont quand même des offres à bas prix (ça doit démarrer à un peu moins de $4 par mois…) et ayant toujours un hébergement chez eux (ils n’ont quand même pas supprimer les comptes existants !), si ça intéresse des gens que je publie comment faire pour mettre en ligne l’application, je le ferai avec plaisir.
En attendant si vous avez une dédibox ou un serveur dédié, vous pouvez toujours lire cet autre billet qui vous expliquera comment mettre en place un hébergement Rails digne d’un serveur de production, depuis l’installation jusqu’au déploiement de l’application grâce à Capistrano.
Hébergement Dreamhost
Pour ceux qui sont intéressés par un hébergement un peu plus professionnel avec une architecture proche de celle que j’ai déployée sur ma dédibox, je vous conseille d’aller voir chez Dreamhost. Pour $9.95 par mois, vous aurez accès à plus de 200Go d’espace disque, 1 To de transfert/mois, base mysql illimitées, 3000 comptes mails et 75 users SSH/FTP. Vous pourrez alors faire du RubyOnRails mais aussi du PHP4 ou PHP5, vous pourrez utiliser un serveur de versionning (Subversion), vous pourrez même déployer votre application en utilisant Capistrano !
Le prix tombe à $7.95/mois si l’on paye pour 2 ans, mais ce n’est pas tout, avec cet hébergement vous avez un nom de domaine offert et vous pourrez rapidement déployer votre propre blog Wordpress (comme le mien) ! Enfin, vu que j’ai déjà un hébergement là-bas, je peux vous faire profiter d’une ristourne de $50 sur votre achat en saisissant ce code promo en bas de page : STONEAGECODE.
Pour aller plus loin …
Je conseille vivement la lecture du livre “Agile Web Development With Rails” qui présente la création d’une boutique de ecommerce en Rails de façon très didactique.
et enfin pour aller encore plus loin …
Update 05/06/07 : Je viens d’écrire un nouvel article sur comment faire un nuage de tag avec ruby on rails, il fait suite à cet article et reprend le même exemple.
Trackbacks
Use this link to trackback from your own site.

Merci pour ce tutoriel très bien fait ! Grâce à vous j’ai fait ma première application Ruby on Rails. Je reconnais que c’est impressionnant de faire fonctionner une application ( et de créer la base de données qui va avec !) en ne tapant que quelques lignes de code. Maintenant faut voir ce que ça donne sur des projets un petit peu plus importants, et si le langage Ruby a autant de possibilités que C#, Java, …
Merci beaucoup pour ce tutorial qui passe en revue tous les points importants pour une première application! C’est beaucoup plus instructif qu’un “hello wolrd”! Sinon je suis chez hostingrails (j’avais fait un compte gratuit à l’époque…) et j’aurais effectivement voulu savoir comment mettre en ligne. Il m’a semblé voir qu’il fallait faire un “rails nomdelappli” sur le serveur par ssh puis de mettre les fichiers qu’on a ajouté/modifié? Est-ce juste?
Noé> Oui on peut faire comme ça, de toute façon la difficulté principale n’est pas d’envoyer les fichiers (qu’ils soient générées sur le serveur ou transférés par FTP c’est la même chose), non ce qui est un peu plus dur c’est de configurer l’application pour fcgi…
Je jetterai un oeil ce soir et si j’ai le temps je laisserai un petit mot pour expliquer comment le faire.
Pour l’installation sous Windows, je n’ai pas testé InstantRails qui ne m’a pas semblé si Instant que ça ^^ En fait j’ai vu en bas de leur page ceci : ” Instant Rails est basé sur le projet open source EasyPHP∞.” Et ça m’a fait un peu peur :/
Ce que je préconise pour une installation sous Windows c’est tout d’abord :
1- Installer WAMP5, qui est pour moi le plus simple d’utilisation, pour avoir la BDD MySQL avec l’interface PhpMyAdmin (ce qui peut donc servir pour tout autre langage web)
2- Installer Gem grâce à cet installeur : http://rubyforge.org/projects/rubyinstaller/
3- Ouvrir une invite de commande (donc “démarrer” -> “éxecuter” -> “cmd”)
4- Entrer la commande “gem install rails —include-dependencies” pour installer Rails sur sa machine
5- Télécharger RadRails sur http://www .radrails.org/page/download
Voila voila
En gros c’est très semblable à Ubuntu, sauf qu’il faut aller chercher les programmes à la main.
Je testerai ce tuto qui m’a l’air bien sympa plus tard quand j’aurais le temps
Salut Aurélien ! Moi aussi j’ai trouvé qu’InstantRails n’était pas si génial que ça.
J’ai conçu un installeur automatique qui installe globalement sur le système Ruby, Rubygems, Rails, Mongrel et RadRails et autoconfigure RadRails.
Le package s’appelle EasyRails et est disponible sur http://www.easyrails.org
Bon développement avec Rails. Nicolas
Rebonjour
.
J’ai complètement oublié de commenter ce tutoriel. Il est très bon, j’ai pas grand chose à redire. Bravo, c’est le tutoriel que devrait lire tous les développeurs qui veulent découvrir Rails.
Nicolas.
Bon articles, félicitation !
Une toute petite remarque : si on supprime un CD, il faudrait également supprimer ses commentaires. Dans le modèle Cd : has_many :comments, :dependent => :destroy
Bonne idée Nicolas le package easyrails, je l’ajoute à la liste des possibilités d’installation de mon tuto tout comme la méthode d’Aurélien.
Rénald > Bonne remarque. Merci !
très bonne idée de faire ce tuto. Je connais surtout php mais je ne suis pas informaticien ou programmeur professionnel. C’est juste un passe-temps. Question : serait-il possible de développer un petit jeux 2D en ligne (genre puissance 4 ou mieux jeux d’echec) avec Rails ? les sites actuels utilisent surtout Java. et encore bravo pour cette decouverte de RoR.
Les jeux utilisent une technologie client-serveur nécessitant des envois instantanés. C’est pourquoi aujourd’hui ils sont majoritairement réalisés en Java (applet) ou Flash. Cependant il est possible d’utiliser Ajax pour réaliser des connexions clients-serveur en temps réel, la réalisation d’un jeux est alors tout à fait possible. (Exemple de chat en temps réel avec ROR)
boubek : parfaitement c’est possible. Surtout sachant que rails incorpore Script.aculo.us, une librairie JavaScript permettant des effets graphiques sympathiques. Couplé avec Prototype et l’AJAX, il est possible de faire un jeu de plateau sans rafraîchissement de page.
Un Othello en Rails : http://www.railthello.com/
create app/models/cd.rb
create test/unit/cd_test.rb
create test/fixtures/cds.yml
create db/migrate/001_create_cds.rb
pourquoi c’est cd_test.rb puis hop cds.yml
ca passe de cd à cds ?
C’est un des principes de Rails qui veux ça ! “Conventions Over Configuration” En fait beaucoup de fichiers doivent respecter des syntaxes particulières si l’on veut que la magie du framework Rails opère…
Ensuite pourquoi des fois avec un “s” et d’autre non, c’est je pense pour des raisons de logique. cd_test.rb est le fichier qui contient les tests unitaires sur LE modèle CD. cds.yml quant à lui est un fichiers de “fixtures” c’est à dire un peu comme un CSV ou un XML, il contient des informations qui dans ce cas sont DES cds (et non pas les informations d’un seul CD).
Ces dénominations m’ont aussi posées problème au début, avec le temps elles te paraîtront plus claire et plus fondées.
L’AJAX ne fonctionnait pas chez moi jusqu’à ce que j’ajoute
dans le header de layouts\cd.rhtml, c’est normal ou j’ai oublié autre chose ?
Pangel, bonne remarque ! C’est un oubli de ma part. On peut effectivement inclure Prototype mais plus généralement on utilise la commande suivante :
entre les balises head du fichier app/views/layouts/cd.rhtml
Bonjour,
Votre article est très intéressant et sort des habituels wiki et blogs en 20 minutes.
J’ai lu le livre “Ruby On Rails” chez Eyerolles, que je conseille de même à tout le monde (il est épuisé mais une nouvelle version sortira … un de ces jours).
Dans tous les exemples qu’on rencontre, le magique scaffold n’intervient que dans les premiers instants de la création du site.
N’existe t’il aucun moyen d’utiliser scaffold pour autre chose que des tables très simples ? C’est à dire des tables utilisant par exemple des clés étrangères ? (sachant qu’on précise toutes les relations inter-tables dans le modèle…)
Si vous avez la réponse, ou si vous connaissez un moyen d’obtenir de plus profond renseignements sur scaffold, je suis tout ouïe
Merci d’avance
Piwaï
Bonjour Piwai,
Le scaffold ne te permettra pas d’aller aussi loin que tu le souhaites, c’est une méthode de génération qui est surtout utile pour “démarrer” un projet rapidement.
Cela te permet d’avoir un exemple sous la main que tu pourras rapidement modifier par la suite. Je dirais que le scaffold est un atout pour Rails permettant aux gens de facilement découvrir Rails (par comparaison avec d’autres frameworks). Il n’est pas un outil qui doit servir pour faire toute une application !
Ensuite, si tu cherche plus d’informations sur les relations avec Rails, je te conseille de chercher avec l’ami Google sur les termes suivant “has_and_belongs_to_many”, “habtm” ou encore “belongs_to” ou “has_many :through”…
Merci pour cette réponse.
En fait, ayant lu “Ruby On Rails”, j’ai aussi vu tout ce qui touchait aux relations.
Effectivement, scaffold semble être un outil insuffisant, fort heureusement il semble qu’il existe des plugins qui font aussi du scaffolding, et gérant les relation parent-enfant par exemple.
DRYscaffolding, Ajaxscaffolding et masterview semble être des outils intéressants
.
Merci, et bonne journée
@++
Piwaï
Très bon tuto, merci c’est un bon point de départ…
Excusez ma toute jeune expérience, mais comment faire pour ajouter un visual_effect de type appear par exemple pour l’apparition d’un nouveau commentaire en ajax ?
Je patauge un peu avec ca :p
Il y a plusieurs façon de faire cette chose en Rails, l’une des plus simple est d’utiliser un callback sur le formulaire. Tu as une liste complète des callbacks sur cette page.
Le principe est donc de mettre un paramètre à ton formremotetag. Imaginons que le commentaire ajouté soit encadré par un
Alors en ajoutant cela à ton form_remote_tag, cela devrait fonctionner :
NB : Je n’ai rien testé ! Hésitez pas à me reprendre si je fais du flan !
Bonjour, Merci pour le tutoriel, c’est trés sympa… Vraiment bien pour tester… (la progression est très intéressante)
Par contre, j’ai un petit soucis, et j’ai pas encore trouvé d’ou ça vient… Tout est impec, mais je me plante à AJAX ?? Même avec le include_tag dans le layout..
(ligne 19 de la vue show, celle ci )
(nota : je suis sous ubuntu, sur un amd64, ce qui complique un peu les choses parfois
)
Je pige pas bien ce qu’il veut me dire… Il manque une méthode dans l’objet CD ?
Merci de vos réponses.
… ton code me semble bizarre… Je ne suis pas certain de tout comprendre ! (Peut être essaye de copier l’ensemble du code sur Pastie) et donne nous le lien…
A propos de l’erreur: undefined method `include?’ for :cd:Symbol
elle semble provenir (pour moi) de la syntaxe de l’url du formremotetag du fichier app/views/cd/show.rhtml
au lieu de :
url => {:controller=> :cd,
remplacer par:
:url => {:controler=> :cd,
pour moi ça règle le problème.
J’ai encore quelques investigations à faire pour déterminer pourquoi d’une part controler peut-être utilisé comme controller en paramètre du script generate (avec le même effet), d’autre part pourquoi controller ne passe pas à cet endroit. (un beau mélange entre la syntaxe avec ou sans les 2 L qu’il va falloir que je clarifie…)
Très bon tutoriel, merci à l’auteur.
[…] Après mon long didacticiel sur Ruby On Rails, me voilà de retour sur des articles plus courts (si si je vais essayer !) pour faire le tour de quelques uns des plugins qui font la force du framework Rails. […]
Bonjour,
Un mot: excellent.
Bonne continuation
Je trouve ce tutoriel excellent, malgré un comportement qui a failli me faire lâcher le morceau: lors de l’accès à l’application, la première fois, j’ai eu un
(alors que database.yml spécifiait bien un autre user)
Comme Google est mon ami, j’ai trouvé une page où on disait qu’il suffisait de relancer le serveur… et effectivement, ça a suffit à corriger le problème!
Super tutoriel j’ai suivi ton tutoriel avec netbeans 6 et fabriquer la base avec wamp tout à marcher Ajax aussi sinon j’ai essayé avec InstantRails ça marche très bien aussi je l’ai mis à l’interieur de wamp/www et InstantRails Manager marche très bien (en stoppant wamp). j’ai pas utilisé mongrel easyrailsmanagement en mode MDOS pouvait marcher en même temps que netbeans seul le localhost:3000 sans /cd ne marche pas christian
Bonjour,
J’ai envi d’aller plus long dans ce tuto mais malheureusement lorsque je tape la commande “rake db:migrate” et ben! fonctionne po!
eropa@eropa-desktop:~/rails/basejean$ rake db:migrate (in /home/eropa/rails/basejean) rake aborted! No such file or directory - /tmp/mysql.sock
(See full trace by running task with —trace) eropa@eropa-desktop:~/rails/basejean$
Avez-vous une idée pour un débutant comme mo ? Merci !
Oui j’ai une petite idée… est ce que MySQL est lancé ?
[…] Voilà, l’article pourrait s’arrêter là car le README du plugin est assez explicite, cependant nous allons poursuivre jusqu’à l’affichage de notre nuage de tags… Comme d’habitude pour faire tout ça je vais m’appuyer sur un exemple, et depuis peu j’en ai un tout prêt sous la main : celui de l’article “Ma première application Rails” ! Cette application gère simplement une base de données de CDs et permet à un visiteur d’ajouter un commentaire sur un album. […]
Bonjour,
Trés bon article pour débuter rapidement dans Ruby on Rail avec en prime une bonne intro à l’Ajax.
Petit correctif éventuellement; j’ai le message d’erreur qui apparrait :
./script/../config/../app/controllers/cd_controller.rb:55: warning: don't put space before argument parenthesesIl faut donc enlever l’espace avant la parenthèse dans le fichier /app/controllers/cd_controller.rb ; ce qui donne :
render(:partial => "comment", :locals => { :comment => @comment } )[…] Stoneageblog.com » Ma première application Ruby On Rails (tags: rails rubyonrails CD-collectie frans howto) […]
Le tutoriel est vraiment très bon! Dans la partie Ajax, je crois que l’emploi de
form_remote_tag(:url=> {:controller=> :cd, :action=> :add_comment, :id=> @cd}, :update=> ‘comments’, :position=> :bottom)n’est pas nécessaire, parce que ce n’est pas remote (c’est le même contrôleur “
cd”). On peut simplement l’écrire:form_tag:action=> “add_comment”, :id=> @cd, :update=> ‘comments’, :position=> :bottomLe “remote” sert justement à générer une requête asynchrone afin que l’action s’exécute sans rechargement complet de la page. Si tu ne précise pas le remote, alors cela fonctionnera mais pas en “Ajax” !
Excellent tutorial. Info pour ceux qui utilise InstantRails, et donc la ligne de commande DOS/Windows : les commandes script/generate et cie s’executent comme cela : ruby [commande] ex : ruby script/generate model cd.
Bravo et Merci pour ce tutorial pédagogique. Merci de donner de ton temps pour que des gens comme nous puissent apprendre ! Perso je suis sous OS X, et j’utilise Locomotive (http://locomotive.raaum.org/), un projet sympatique qui installe tout Ruby on Rail d’un coup. Je le recomande pour tous les utilisateurs Mac
Bonjour ;
Moi qui suis pro perl/php, j’halucine !!!
Très bon tuto.
J’étais aussi pro PHP… avant
Merci super tuto, tu m’as pas mal eclairci.
Merci, vraiment un excellent tutoriel je n’ai eu absolument aucun problème, être sous Ubuntu ça aide aussi pas mal. Encore merci.
tu n’aurais pas oublié de créer les tables mescd_development, test et production ?
Ok, vu, je voulais dire bdds à la place de tables et je viens de voir que tu avais appelé ta bdd mycds dans le fichier database.yml. Mais ça m’a coincé un moment.
Enfin un tutoriel digne de ce nom!! J’en ai déjà parcouru, et c’est le seul qui est correct.
Juste une toute petite faute dans le cd.rb :
class Cd
has_many :comments
validatespresenceof :title, :author
end
title doit être titre (voir _form.rhtml)
Encore un grand merci, j’avais hâte de découvrir RoR correctement, maintenant c’est fait, je me dépêche de découvrir les autres billets.
Cdlt,
Shoghi
salut c’est la premiere fois en 10 ans que je laisse un post de félicitation. Je viens aussi du php4et5 (conaissant java 2.0). Jai comencé un projet assez ambitieux ya qqes mois déja en php.Et depuis peu je me pose la question, aprés avoir compry le ruby,si je n’allais pas revoir tte l’architecture de mon projet. kel histoire…!! Ruby on Rails est magique = un génie de processus qui nous facilite le deloppement = fortiche les japonais
bref si tu pouvais me contacter histoire d’avoir qqes conseils sur mon web project 3.0
chapo pour ton tuto pedago de la par de psyko
Ce tutoriel à l’air top malheureusement il ne marche plus avec Rails 2.0
.
Oui, c’est possible. Rails 2.0 apporte son lot de nouveauté dont la notion d’application REST et ce n’est pas rien !
Je ferai un petit article un de ces 4 sur Rails 2.0, si j’en ai le courage je mettrai à jour le tuto.
NB : Pour commencer avec Rails 2.0 et bien comprendre les notions qu’il amène je vous conseille de lire les article de (en) SoftiesOnRails. Une traduction française semble avoir été faite sur le joli blog de BioloGeek.
hello, thanks for the tuto, but I am having problems as I am on Ubuntu 7.10. I had issues installing it, but I managed by finally using the packages. Now, I am at the scaffold stage, but I get a
undefined methodscaffold’ for CdController:Class` . Any idea ? thanksDesole pour ce commentaire en anglais… l
habitude. Je disais donc que jai eu des problemes dinstallation sous Ubuntu 7.10, mais resolu maintenant. Par contre, jai une erreur : undefined methodscaffold’ for CdController:Class\Une idee ? merci, raph
Je viens d’avoir le meme probleme que toi Raph. D’apres ce que j ai compris, la methode ‘scaffold’ n’est plus dans la version 2 de Rails. C’est pourquoi il sort cette erreur. Par contre tu peux tojours générer un scaffold (je viens d’essayer).
Ha au fait merci pour ce ptit tuto Pierre.
Bonjour,
J’ai aussi le problème avec Rails 2 et le scaffold, comment faire pour continuer à apprendre ?
Merci pour ce tuto extra !
Alexis
Pour les nouveaux (comme moi) qui arrivent sur Rails 2, voici un tuto tout aussi sympa que celui de Pierre à cette adresse: http://fairleads.blogspot.com/2007/12/rails-20-and-scaffolding-step-by-step.html Je confirme que certaines étapes ont changé… Bonne continuation.
Génial !