Stoneageblog.com

Le blog [de l'âge] de Pierre

Ma première application Ruby On Rails

with 61 comments

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.

  1. Linux (Ubuntu) : Installer Ruby On Rails & Eclipse (Radrails)
  2. OSX : HowtoInstallOnOSXTiger et quelques mots sur TextMate, un éditeur adulé par les inconditionnels de la pomme.
  3. 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)
  4. (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 !)
  5. Windows par Aurélien : Utilisation de WAMP5, la procédure est décrite dans son commentaire en bas de page.
  6. __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

Welcome aboard

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 !
Scaffolding - Creating
Scaffolding - List 2

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 ‘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 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 :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 :

Fiche CD

Contenu

:

‘edit’, :id => @cd %> |
‘list’ %>

Commentaires

-

Ajouter un commentaire :

« add_comment », :id=>@cd %>
Auteur :
Email :

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 « form_tag » envoie les résultats du formulaire sur l’action « add_comment » 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 « 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)

-

Ainsi notre fichier app/views/cd/show.rhtml devient (dans la partie concernant les commentaires) :

Commentaires

« comment », :collection => @cd.comments) %>

Ajouter un commentaire :

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 :

Ajouter un commentaire :

{:controller=> :cd, :action => :add_comment, :id => @cd }, :update => ‘comments’, :position=> :bottom) %>
Auteur :
Email :
60, « rows » => 5 %>

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 :

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.

Written by pierrerigal

mars 4th, 2007 at 12:36

61 Responses to 'Ma première application Ruby On Rails'

Subscribe to comments with RSS or TrackBack to 'Ma première application Ruby On Rails'.

  1. 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, …

    Touthankarton

    4 mar 07 at 22 h 18 min

  2. 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é

    6 mar 07 at 8 h 23 min

  3. 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.

    Pierre Rigal

    6 mar 07 at 9 h 42 min

  4. 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

    Aurélien

    9 mar 07 at 14 h 07 min

  5. 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

  6. 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.

  7. 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

    Rénald CASAGRAUDE

    12 mar 07 at 14 h 32 min

  8. 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 !

    Pierre Rigal

    17 mar 07 at 23 h 04 min

  9. 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.

    boubek

    18 mar 07 at 7 h 28 min

  10. 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](http://ajaxian.com/archives/realtime-on-rails-real-time-chat-using-xhr-push))

    Pierre Rigal

    18 mar 07 at 11 h 02 min

  11. 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/

  12. 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 ?

    Alex

    21 mar 07 at 17 h 37 min

  13. 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.

    Pierre Rigal

    21 mar 07 at 19 h 55 min

  14. L’AJAX ne fonctionnait pas chez moi jusqu’à ce que j’ajoute

    …javascript_include_tag « prototype »…

    dans le header de *layoutscd.rhtml*, c’est normal ou j’ai oublié autre chose ?

    pangel

    24 mar 07 at 2 h 14 min

  15. 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_

    Pierre Rigal

    24 mar 07 at 12 h 26 min

  16. 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 :D

    Merci d’avance

    Piwaï

    Piwaï

    25 mar 07 at 18 h 45 min

  17. 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 »…

    Pierre Rigal

    26 mar 07 at 19 h 43 min

  18. 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ï

    Piwaï

    27 mar 07 at 7 h 58 min

  19. 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

    Gyome314

    30 mar 07 at 9 h 56 min

  20. 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](http://ap.rubyonrails.com/classes/ActionView/Helpers/PrototypeHelper.html).

    Le principe est donc de mettre un paramètre à ton form_remote_tag. Imaginons que le commentaire ajouté soit encadré par un

    Alors en ajoutant cela à ton form_remote_tag, cela devrait fonctionner :

    :complete => « Effect.Appear(‘lastcomment’) »

    NB : Je n’ai rien testé ! Hésitez pas à me reprendre si je fais du flan !

    Pierre Rigal

    30 mar 07 at 18 h 26 min

  21. 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..

    undefined method `include?’ for :cd:Symbol

    (ligne 19 de la vue show, celle ci )

    19: {:controller=> :cd, :action => :add_comment, :id => @cd }, :update => ‘comments’, :position=> :bottom) %>

    (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.

    Sylvain Cherrier

    31 mar 07 at 10 h 47 min

  22. … ton code me semble bizarre… Je ne suis pas certain de tout comprendre ! _(Peut être essaye de copier l’ensemble du code sur [Pastie](http://pastie.caboo.se/))_ et donne nous le lien…

  23. A propos de l’erreur:
    undefined method `include?’ for :cd:Symbol

    elle semble provenir (pour moi) de la syntaxe de l’url du form_remote_tag 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.

    franck B.

    7 avr 07 at 11 h 28 min

  24. [...] 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. [...]

  25. Bonjour,

    Un mot: excellent.

    Bonne continuation

    atik

    11 mai 07 at 15 h 26 min

  26. 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

    Access denied for user ‘root’@'localhost’ (using password: NO)

    (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!

  27. 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

    christian

    21 mai 07 at 18 h 22 min

  28. 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 !

    eropa

    28 mai 07 at 15 h 12 min

  29. Oui j’ai une petite idée… est ce que MySQL est lancé ?

    Pierre Rigal

    30 mai 07 at 9 h 05 min

  30. [...] 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. [...]

  31. 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 parentheses

    Il 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 } )

    Thomas

    10 juin 07 at 14 h 09 min

  32. [...] Stoneageblog.com » Ma première application Ruby On Rails (tags: rails rubyonrails CD-collectie frans howto) [...]

  33. 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` => :`bottom`

    Diego Figueira (Argentina)

    7 juil 07 at 22 h 31 min

  34. Le « 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 » !

    Pierre Rigal

    9 juil 07 at 14 h 58 min

  35. 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.

    benjamin

    12 juil 07 at 10 h 19 min

  36. 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

    Roland

    12 sept 07 at 11 h 15 min

  37. Bonjour ;

    Moi qui suis pro perl/php, j’halucine !!!

    Très bon tuto.

    nuxwin

    29 sept 07 at 4 h 31 min

  38. J’étais aussi pro PHP… avant ;)

    Pierre Rigal

    29 sept 07 at 18 h 58 min

  39. Merci super tuto, tu m’as pas mal eclairci.

    regis

    16 oct 07 at 4 h 34 min

  40. Merci,
    vraiment un excellent tutoriel
    je n’ai eu absolument aucun problème,
    être sous Ubuntu ça aide aussi pas mal.
    Encore merci.

    spainvictorcompany

    29 oct 07 at 15 h 43 min

  41. tu n’aurais pas oublié de créer les tables mescd_development, test et production ?

    patrice

    25 nov 07 at 2 h 33 min

  42. 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.

    patrice

    25 nov 07 at 2 h 42 min

  43. 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
    #validates_presence_of :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

    Shoghi

    25 nov 07 at 18 h 31 min

  44. 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

    psyko3.0

    27 nov 07 at 5 h 45 min

  45. Ce tutoriel à l’air top malheureusement il ne marche plus avec Rails 2.0 :( .

    Logam

    26 déc 07 at 16 h 41 min

  46. 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](http://www.softiesonrails.com/search?q=rest+101). Une traduction française semble avoir été faite sur le joli blog de [BioloGeek](http://www.biologeek.com/journal/index.php/pour-ne-plus-etre-en-rest-comprendre-cette-architecture).

    Pierre Rigal

    26 déc 07 at 17 h 02 min

  47. 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 method `scaffold’ for CdController:Class` . Any idea ? thanks

    raph

    26 déc 07 at 17 h 34 min

  48. Desole pour ce commentaire en anglais… l`habitude.
    Je disais donc que j`ai eu des problemes d`installation sous Ubuntu 7.10, mais resolu maintenant.
    Par contre, j`ai une erreur : undefined methodscaffold’ for CdController:Class

    Une idee ?
    merci, raph

    raph

    26 déc 07 at 17 h 37 min

  49. 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.

    Lingus

    4 jan 08 at 10 h 24 min

  50. Bonjour,

    J’ai aussi le problème avec Rails 2 et le scaffold, comment faire pour continuer à apprendre ? :-)

    Merci pour ce tuto extra !

    Alexis

    Alexis

    15 jan 08 at 1 h 42 min

  51. 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.

    François

    22 jan 08 at 1 h 07 min

  52. Génial !

    Alexis

    28 jan 08 at 1 h 24 min

  53. [...] A Simple French Tutorial to start with Rails : Ma première application RubyOnRails [...]

  54. Pour le changement avec Rails2, moi j’y suis arrivé avec ça :

    >ruby script/generate scaffold Cd title:string author:string description:string

    comme indiqué dans le tuto http://fairleads.blogspot.com/2007/12/rails-20-and-scaffolding-step-by-step.html dont François a parlé un ptit plus haut.

    Sinon merci pour le tuto, je débute en Rails et j’avoue être un chouya impressioné :)

    Thibane

    10 nov 08 at 23 h 27 min

  55. [...] A Simple French Tutorial to start with Rails : Ma première application RubyOnRails [...]

  56. Merci pour le tuto. C’est juste dommage que ça ne marche plus avec la nouvelle version.

    Pourquoi ne pas faire une petite mise à jour si vous avez le temps.

    Sébastien

    25 nov 08 at 4 h 08 min

  57. Merci Thibane

    cifren

    19 juin 09 at 15 h 28 min

  58. J’ai fini le tuto sauf la partie « Passage en production » (ca m’interressait pas), Donc sachant que rails a un peu changé, je donne quelques solutions pour le tuto (les erreurs que j’ai eu) :
    j’ai installer InstantRails (V2.0)
    - Creation du Scaffold : ruby script/generate scaffold cd title:string author:decimal etc..
    - class CdController < ApplicationController
    scaffold :cds
    end
    - Listing et formulaire de création de commentaire : au lieu de ‘edit’, :id => @cd %>
    et la meme pour les autres liens
    - Au niveau du Form_Tag, une erreur est presente lorsqu’on execute la page, No Route… il suffit de rajouter map.route ‘/:controller/:action’ a la fin du fichier ‘/config/routes.rb’
    - Erreur aussi la :  » {:controller=> :cd, :action => :add_comment, :id… » il faut mettre {:action => ‘add_comment’, :id… »

    Voila a peu pres ce que j’ai pu trouver pour finir ce tuto qui explique bien comment ca fonctionne.

    cifren

    22 juin 09 at 18 h 01 min

  59. Bravo et merci pour ce tutorial qui m’a permis de mieux comprendre quelques rouages de Rails :-)

    Cédric

    11 mai 10 at 16 h 02 min

  60. Bonjour, je débute en programmation. Puis-je commencer par Ruby, si oui, par où?
    Et sinon, par quoi?
    Je voudrais arriver à développer un site de façon autodidacte. Est-ce que je rêve en couleur?
    Merci de bien vouloir prendre le temps de répondre au tout petit débutant que je suis.

    Alain

    8 juin 10 at 2 h 50 min

  61. Salut je viens juste de decouvrir RoR et j’avoue que cela me plairait beaucoup de bien l’utiliser sur linux tout comme sur windows merci pour le tuto, est ce que quelqu’un l’a deja essayer sur windows merci

    kader

    26 jan 12 at 17 h 13 min

Leave a Reply