Midilibre.fr
Tous les blogs | Alerter le modérateur| Envoyer à un ami | Créer un Blog

27/10/2009

[rails] - Comprendre le fonctionnement de Rails avec le scaffold

504508655.jpegEn Ruby on Rails il existe une fonctionnalité bien pratique :  Scaffold. C'est un outil d'apprentissage trés intéressant pour générer automatiquement une 'application'. En effet avec un minimum de paramétres on peut voir tourner ce que l'on souhaite et surtout en analyser le code source pour comprendre le fonctionnement de Rails.

Nous allons voir comment créer une application qui génére une liste de course (mais vous pouvez tout aussi bien tester avec une liste de CD, de recette, ...). Comme à chaque fois il est préférable de définir ce que nous allons faire  :

Nom de l'application : liste de course
Table : courses
Champs nécéssaires : article et quantite

rails  liste_de_course -d mysql
cd liste_de_course


Configurez config/database.yaml pour coller aux paramétres de votre base de donnée (username, password et host, attention pour ce dernier il peut être nécéssaire d'indiquer 127.0.0.1 au lieu de localhost)

Enfin créons la base de donnée associé avec :
rake db:create

Nous voila prêt à créer une table et les champs que nous avons défini. En respectant la convention notre modèle étant Course les noms des tables seront en minuscule et au pluriel, ce qui nous donne comme nom de table courses. Les noms des champs seront : article en tant que string et quantite en tant que nombre (integer).

Voici la commande magique du scaffold :
script/generate scaffold Course article:string quantite:integer

Ce qui génére un certain nombre de fichiers :
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/courses
exists app/views/layouts/
exists test/functional/
exists  test/unit/
create test/unit/helpers/
exists public/stylesheets/
create app/views/courses/index.html.erb
create app/views/courses/show.html.erb
create app/views/courses/new.html.erb
create app/views/courses/edit.html.erb
create app/views/layouts/courses.html.erb
create public/stylesheets/scaffold.css
create app/controllers/courses_controller.rb
create test/functional/courses_controller_test.rb
create app/helpers/courses_helper.rb
create test/unit/helpers/courses_helper_test.rb
route  map.resources :courses
dependency model
exists app/models/
exists    test/unit/
exists test/fixtures/
create app/models/course.rb
create test/unit/course_test.rb
create test/fixtures/courses.yml
create db/migrate
create db/migrate/20091026231134_create_courses.rb


Ceux qui sont précédés de exists on été crée lors de la première invocation de la commande rails, ceux précédés de create sont crée.

Si vous regardez dans le fichier db/migrate, vous verrez ceci :

class CreateCourses < ActiveRecord::Migration
def self.up
create_table :courses do |t|
t.string :article
t.integer :quantite

t.timestamps
end
end

def self.down
drop_table :courses
end
end


self.up est tout ce qui sera crée lorsque nous lancerons la migration et self.down tout ce qui sera éffectué lorsque nous reviendrons un cran en arriere. Ainsi nous voyons que cette migration crée bien une table courses, et un string article et un integer quantite. Ceci est cohérent avec ce que nous voulons, lançons la migration :

rake db:migrate

Afin de simplifier l'accés à notre petit programme, éditez le fichier config/routes.rb et ajouter cette ligne :

map.root :controller => 'courses', :action => 'index'

nous définissons le répertoire racine de notre application, qui pointera sur le controller courses et l'action index (n'oubliez pas d'éffacer le fichier public/index.html).

Lancez maintenant le serveur avec :
script/server

Dans votre navigateur ouvrez : http://localhost:3000, vous devriez avoir ceci :

liste.jpg

Ainsi vous pouvez ajouter des nouvelles courses, et une fois la base rempli, les éditer, les supprimer ou les afficher. Ce qui corresponds au modèle CRUD : Create, Read, Update et Delete. Vous noterez que l'on retrouve chacun des modèles dans le controller : CoursesController du fichier app/controller/courses_controller.rb (avec show, new, update et destroy) et également dans chacune des vues dans app/views/courses avec les fichiers new.html.erb, edit.html.erb ... ce qui vous permet de voir l'interaction entre le controller et les vues. Quand au modèle crée automatiquement par le scaffold et présent dans app/model/course.rb il est tout simple :

class Course < ActiveRecord::Base
end


Mais vous pouvez par exemple définir que la saisie d'un article est obligatoire et que la partie quantite est forcément numéraire et ce trés simplement :

class Course < ActiveRecord::Base
validates_presence_of :article
validates_numericality_of :quantite
end


la liste des validations possible est disponible ici : http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html

Essayez à présent de saisir un article vide, ou une quantité non numéraire. Un message vous avertira de l'erreur. Pour l'instant tout ceci est en anglais mais nous verrons prochainement comment franciser une application. Ce qui est important c'est de voir qu'en 4 lignes de codes on peut obtenir une application MVC fonctionelle et prête à tourner, cela permet d'observer et de tester sur une base opérationnelle. Essayer par exemple de faire d'autres exemples avec scaffold sur d'autres sujets. Analyser le code et les interactions entre le controller et la vue. Nous verrons la prochainne fois comment créer une application sans passer par le scaffolding.

23/10/2009

[rails] - Un hello world en ruby on rails

rails.jpeg

Ruby on rails est un framework intéressant mais la documentation pour le débutant est délicate à trouver, et encore plus en français j'ai donc décidé de faire quelques billets sur ce framework. Pour ceux qui se demande se qu'est Ruby on Rails je les renvois a l'excellent wikipedia.

Nous allons voir le plus simple des exemples que l'on puisse creér en RoR : un petit programme qui va nous dire soit bonjour soit aurevoir.

Placer vous en ligne de commande et tapez :

rails bonjour_monde -d mysql
le denier argument est bien entendu à modifier si vous utiliser un autre type de base de donnée (sqlite3...)

Nous allons ensuite rentrer dans le répertoire que vient de nous créer rails, ne tenez pas compte du nombre de fichier. C'est un peu affolant au début mais ce que vous devez retenir pour aujourd'hui c'est qu'il à généré d'un coté les éléments de type code (ce que nous allons voir dans app/controllers) et les répertoires de vue qui seront ce que va nous afficher le navigateur (app/view).

cd bonjour_monde

modifiez ensuite config/database.yml en fonction de sa base de données MySql (attention sur mon poste localhost ne fonctionne pas il m'a fallut mettre 127.0.0.1. Autre point délicat respecter les espaces aprés les :

Créons la base de données :

rake db:create

voyons si tout fonctionne en lançant :

script/server

Avec votre navigateur connectez vous sur localhost:3000, vous devriez avoir ceci :

rails_c.jpg

C'est la page d'accueil qui nous indique que notre serveur fonctionne bien, et qu'il n'y a pour l'instant rien de configurer.
Nous allons créer notre premier controller pour afficher un message.

script/generate controller message

Dans le dossier app/controllers vous avez maintenant un nouveau fichier avec uniquement cette entrée :

class MessageController < ApplicationController
end


Comme nous voulons afficher un bonjour, nous allons définir une action bonjour et aurevoir, et envoyer une variable à la vue, modifier comme suis :

class MessageController < ApplicationController
def bonjour
@contenu = 'Bonjour le monde'

end
def aurevoir
@contenu = 'Au revoir le monde'
end

end


Il faut maintenant modifier la vue en créant app/view/layouts/application.html.erb qui est globalement le template de notre application, tout ce qui va émaner des actions (ici bonjour et aurevoir) passera dans le yield :

Que va tu nous dire ?:<br/>
<%= yield %>


Créons ensuite les fichiers lié aux actions, comme dans RoR tout est convention, il suffit de créer un fichier du nom de notre action : app/view/message/bonjour.html.erb et app/view/message/aurevoir.html.erb

<%= @contenu %>

Lancer votre navigateur sur http://localhost:3000/message/bonjour et sur http://localhost:3000/message/aurevoir, la magie opére. Nous allons rajouter un menu afin de naviguer dans ces actions controller Message :

<%= render :partial => 'menu' %>

on pourrait mettre deux fois la meme chose mais on va faire un systéme d'include : un rendu d'un partiel (un block). Placer le code ci dessous dans bonjour.html.erb et aurevoir.html.erb. Puis créez un fichier app/view/message/_menu.html.erb (tout partiel commence par un _, la convention RoR saura qu'il faut allez chercher le partiel dans ce fichier) et placez y :

<br/>
<%= link_to 'Je dis bonjour', :controller => "salutation/bonjour" %>
<%= link_to 'Je dis au revoir', :controller => "salutation/aurevoir" %>

le link_to nous permet de créer automatiquement des a href (html) avec son contenu et le lien vers un controller.

Dans message controller nous allons rajouter une action par défaut sur l'index
(de manière a appeller uniquement http://localhost:3000/message) :
def index
@contenu = 'Faites votre choix'
end


il nous faut donc maintenant créer une vue dans app/view/message/index.html.erb, procédez comme ci dessus plaçant le code :

<%= @contenu %>

Enfin nous voulons rajouter un retour à l'accueil / dans le _menu.html.erb des vues il suffit d'ajouter ce lien qui appelle l'action index du controller message :
<%= link_to 'Acceuil', :controller => "message/index" %>

Amusez vous à passer des variables, créer des partiel, et à modifier le fichier app/view/layout/application.html.erb pour améliorer cet exemple. Nous verrons la prochainne fois comment interagir avec une base de données.