Tutorial : créer sa première application Ruby on Rails - Part1
Par jblanche le jeudi 19 juillet 2007, 21:35 - geeks - Lien permanent
Allez, cette fois, c'est parti !
Si vous n'avez pas encore installé ruby on rails et radrails je vous invite a suivre ce tutoriel.
Pour ce premier tutorial, nous allons créer une version très simplifiée de notre application.
Celle-ci s'appellera Depot, nous devons donc créer les bases de donnéesdepot_development, depot_test et depot_production sous notre système de bases de données préféré, pour moi ce sera Postgresql mais les fan de Mysql peuvent l'utiliser (avec l'outil Phpmyadmin par exemple).
Nous devons maintenant indiquer à notre application comment se connecter à la base de données.
Pour cela, éditez le fichier database.yml (situé dans le dossier config) pour obtenir quelquechose comme cela.
development:
adapter: postgresql
database: depot_development
username: depot
password: toto
test:
adapter: postgresql
database: depot_test
username: depot
password: toto
production:
adapter: postgresql
database: depot_production
username: depot
password: toto
La syntaxe parle d'elle même, remplacez simplement postgresql par mysql si nécessaire.
Ensuite, créons le premier modèle (et donc la première table de notre base de données), le modèle Snippet. Pour ce faire, deux méthodes :
- Soit via l'onglet Generator de radrails, choisir modèle dans la liste, puis tapper snippet dans le champ texte
-
Soit, et ce sera ma méthode pour le reste de l'application, dans une console à la racine de l'application :
ruby script/generate model snippet
Nous venons de créer notre modèle et tous les fichiers associés.
Le premier que nous éditerons est le fichier de migration généré par la création du modèle.
Celui-ci se trouve dans db/migrate et se nomme : 001_create_snippets.rb
Ces fichiers servent à créer notre base de données, en les renseignant avec la syntaxe de Rails, celui ci se chargera d'aptader le code pour le système de gestion de base de données que vous avez choisi (MySQL, Postgres...).
Chaque fichier de migration comporte deux méthodes. La méthode up définie ce que nous souhaitons modifier dans la base de données tandis que la méthode down contient ce que ruby devra faire si l'on souhaite revenir en arrière.
Dans notre cas nous créons donc une table snippets avec les champs titre et texte dans la méthode up, et de quoi détruire cette table dans la méthode down.
Voilà le résultat :
class CreateSnippets < ActiveRecord::Migration
def self.up
create_table :snippets do |t|
t.column :titre, :string
t.column :texte, :text
end
end
def self.down
drop_table :snippets
end
end
Après avoir faire ceci, retournons dans la console et éxécutons :
Ruby devrait avoir créer notre table et les champs associés.
Pour commencer, nous allons entrer des données de test dans ces tables en écrivant dans le fichier snippets.yml dans test/fixtures.
Voilà comment j'ai rempli le mien :
ruby:
id: 1
titre: "Save some time"
texte: "Use Ruby on Rails"
two:
id: 2
titre: "Improve your user experience"
texte: "Use Mozilla Firefox"
Nous allons maintenant créer nos premiers controllers.
J'ai choisi d'en créer deux pour commencer, un controller Admin depuis lequel on pourra ajouter, modifier et supprimer nos Snippets (accessible seulement par les administrateurs) et un controller Snippets qui sera le site accessible par tout le monde.
Allez lancons nous :
puis
Ces deux scripts ont à leur tour créés quelques fichiers et dossiers notamment les fichiers snippets_controller.rb et admin_controller.rb
ainsi que les dossiers app/views/snippets et app/views/admin.
Pour le moment, rendons nous dans le fichier routes.rb situé dans le dossier config.
Ce fichier sert à configurer le lien entre votre application et les url qui lui sont associées.
Nous allons donc appliquer nos propres routes (celles par défaut correspondent à une application non REST).
Pour cela, ajoutons deux lignes au fichier pour obtenir la chose suivante :
ActionController::Routing::Routes.draw do |map|
map.resources :admin, :singular => :admin_instance
map.resources :snippets
map.connect ':controller/:action/:id.:format'
map.connect ':controller/:action/:id'
end
Grâce à ces deux petites lignes l'application est désormais RESTFUL et notre travail sera bien facilité.
Je reviendrais dans un prochain billet sur le :singular pour les curieux).
Il ne nous manque plus grand chose pour avoir une application en état de fonctionnement.
Je vous propose pour terminer ce premier tuto d'écrire les controllers et vues de la partie Snippets (accessible à tous) de notre site.
Pour cela éditons le fichier snippets_controller.rb dans app/controllers.
class SnippetsController < ApplicationController
def index
@snippets = Snippet.find(:all,:order => "id desc")
end
def show
@snippet = Snippet.find(params[:id])
end
end
Est-t'il nécessaire d'expliquer le code tellement celui-ci est simple ?
Allez je vous le fais quand même
La ligne : @snippets = Snippet.find(:all,:order => "id desc") permet de stocker dans la variable @snippets un objet contenant les Snippets
renvoyés par le modèle Snippet quand on lui demande de chercher (find) tous les snippets (:all) en les ordonnant par leur id avec les plus élevés en premiers (:order => "id desc") .
La ligne @snippet = Snippet.find(params[:id]) demande elle au modèle Snippet de chercher l'enregistrement ayant l'id passé en paramètre.
Avec seulement ces deux petites lignes, nous avons tout ce qu'il nous faut pour afficher nos vues.
Rendez-vous donc dans le dossier views/snippets pour créer les deux vues :
Commençons par la vue dédiée à l'affichage d'un snippet que l'on nommera show.rhtml :
<%= content_tag :h2, @snippet.titre %>et poursuivons avec la vue pour les lister nommée
<%= content_tag :p, @snippet.texte %>
index.rhtml :
<% @snippets.eachdo |snippet| %>
<% content_tag :div, :class => "snippet" do -%>
<%= content_tag :h2, (link_to snippet.titre, snippet_path(snippet)) %>
<%= content_tag :p, snippet.texte %>
<% end -%>
<% end %>
Sachez simplement pour l'instant que le :
<% @snippets.each do |snippet| %> permet d'itérer sur l'objet contenant tous les snippets et que la méthode content_tag écrit le tag HTML passé avec le premier paramètre et contenant le deuxième (ex : content_tag :p, "Hello" affichera <p>Hello</p>)
Si vous reproduisez ce tutoriel chez vous, récupérez les fichiers snippets.rhtml (app/views/layout) et snippets.css (public/stylesheets) pour customiser votre interface.
Pour la lancer, éxécutez ruby script/server dans le terminal, celle-ci devrait alors être accessible à l'adresse http://0.0.0.0:3000.
Pour les autres, ma version est disponible ici : http://depot.blogbangbang.com/snippets
Sachez toutefois que la partie <%= yield %> dans le layout ne doit pas etre suprimée puisqu'elle correspond à l'endroit ou s'afficheront les données des vues.
Voilà nous arrivons au terme de ce long tutorial, pas mal de chose à mettre en place pour la première version de cette application mais toute ces choses ne seront plus à refaire et nous permettent désormais d'avoir une miriade de possibilités pour la suite.
Je reviendrais dans le prochain billet sur quelques points précis de ce tutorial et nous crérons ensuite l'interface d'administration.
Archive pour voir l'état actuel de l'ensemble des fichiers.
Commentaires
Bonsoir,
Je voudrais commencer par vous remercier pour ce très bon tuto.
Juste une petite erreur dans le fichier index.rhtml indiqué sur la page du tuto:
<% @snippets.eachdo |snippet| %> --> each do apparaît en un mot, ce n'est pas correct.
J'attends avec impatience vos prochains billets.
Shoghi
Bonjour
Je suis novice en RoR et je vous dis bravo pour ce tutoriel beaucoup plus clair que la plupart de ceux trouvés ailleurs sur le web.
J'ai une question. quand je lance http://localhost:3000/depot dans mon navigateur, j'obtiens l'erreur suivante :
Routing Error
No route matches "/depot" with {:method=>:get}
Avez-vous une idée de ce que j'ai raté...
Merci.
A priori je dirais rien puisque ce comportement est normal.
Nous avons créer les routes pour les controllers snippets et admin, pas de depot.
Depot est le nom de notre application, si tu tiens vraiment a avoir quelquechose à cette adresse il te faut rajouter une route et un controller.
Sinon la racine de ton aplli est accessible directement ca se passe à http://localhost:3000.
Pour configurer la page d'accueil, supprime le index.html du dossier public et ajoute la route suivante :
map.connect '', :controler => "snippet"
Mais tout cela est dans la suite de ce tuto (la partie2)
Bonne chance
Bonjour,
Vraiment bien ton tutoriel, un tout petit détail :
Quand on fait un copier-coller de cette partie, on obtient "each do" sans espace :
<% @snippets.eachdo |snippet| %>
<% content_tag :div, :class => "snippet" do -%>
<%= content_tag :h2, (link_to snippet.titre, snippet_path(snippet)) %>
<%= content_tag :p, snippet.texte %>
<% end -%>
<% end %>
merci encore
Merci,
Après avoir mis moi même un enregistrement dans la bdd, ça fonctionne. Il faut continuer à être aussi clair !
Bonjour ,
Simpa comme tuto ... par contre, j'aimerai savoir quelle est la ligne de commande pour revenir en arriere sur la Base de donnée ... merci
rake migrate VERSION=PLACER_ICI_LE_NUMERO_DE_VERSION_DESIRE
Attention toutefois ce tutoriel commence à dater et peut différer quelque peut des pratiques de Rails2.1
Fil des commentaires de ce billet