Professional Documents
Culture Documents
Gutknecht 2006
Ruby
on
Rails
Olivier Gutknecht
O. Gutknecht 2006
Quelques petites indications sur la syntaxe de Ruby, suffisantes pour ce qui va suivre
Le rajout dune fonctionnalit tracer class Essai < AutreClasse Dfinition dune nouvelle classe Essai
(dfinie autre part) dans cette classe. tracer :tout hritant de la classe AutreClasse
:tout indique un symbole ( voir un peu
comme une chane constante)
Dfinition dune nouvelle mthode
def exemple exemple
On cre un objet de classe Bonjour.
@message = Bonjour.new
@ dsigne une variable dinstance (nul amis = Copains.liste Quand un appel de mthode na pas
besoin de les dclarer avant) de paramtre, on omet dhabitude le ()
Envoie le message saluer lobjet for a in amis amis et a sont des variables locales (nul
@message (avec le paramtre a). besoin de les dclarer avant usage)
@message.saluer(a)
Envoyer un message sur un objet ou sur
une classe utilise la mme syntaxe. end
Ruby tant un langage trs dynamique, on end
a souvent tendance parler denvoi de end
message plutt que dappel de mthode.
O. Gutknecht 2006
Cette introduction ?
La Vue : ActionView
Le Contrleur : ActionController
Pourquoi Rails ?
Prendre le meilleur des deux grandes faons de faire des applications Web
RAILS
Interactif, rapide, Trs structur, cadre
facile apprendre, les architectures,
peu de contraintes, infrastructures
trs souple Rails concilie souplesse de puissantes
dveloppement et attention porte
Peu structur, dur larchitecture des applications Complexe, lourd,
maintenir, pas de long matriser,
sparation entre difficile adapter,
logique et rendu multiples couches
class LivreController
< ApplicationController
def exemple
@etagere = Livre.find(:all)
end
end
<html><body>
<h1>Tous les livres...</h1>
<% for l in @etagere %>
<%= l.titre %>: <%= l.auteur %><br>
<% end %>
</body></html>
Modle(s)
(des fichiers contenant des classes Ruby)
Reprsente les donnes de lapplication,
masque le dialogue avec la base
Contrleur(s)
(des fichiers contenant des classes Ruby)
Gre la logique de la navigation, choisit
quelles informations transmettre la vue
Vue(s)
(des fichiers rhtml : des pages HTML avec du code Ruby)
Permet dlaborer des modles de pages
web et dy inclure les donnes reues
Modle(s)
ActiveRecord
+
Ruby on
=
Contrleur(s)
ActionController
Rails
+
Vue(s)
ActionView
+
Outils supplmentaires
WebServices, Mail, Intgration AJAX...
Dfinir le
Modle
ActiveRecord
O. Gutknecht 2006
ActiveRecord
Les tables correspondront des Les colonnes sont exprimes en
classes Ruby attributs de la classe
livres
id titre auteur isbn
Les ranges sont reprsentes
1 Lusage du monde Nicolas Bouvier 222889401 comme des objets
2 Le seigneur des porcheries Tristan Egolf 2070414736
ActiveRecord est un ORM (Object/Relational Mapper) : il assure le lien entre le monde objet de
Ruby et le monde relationnel de la base de donnes
Cela couvre la fois la structure (comment reprsenter une table en une classe ?) et le
comportement : les problmes non triviaux de la gestion des caches, la validation des
donnes, loptimisation des requtes, la portabilit entre plusieurs moteurs de base de donnes...
O est linformation ?
Objectif : ne jamais avoir besoin de dupliquer la mme information deux endroits
diffrents (dans la structure de la base et dans le code)
Les moteurs Web o la structure des Les moteurs Web o la structure des
donnes nest jamais explicite et se donnes de la base doit tre
retrouve dissmine dans tout le code rexplicite dans des fichiers de
de lapplication configuration du moteur
O. Gutknecht 2006
Exemple
id titre auteur isbn
... ... ... ...
livres
SQL Rails
Sous le capot
Ruby
class Livre < ActiveRecord::Base
end
a = Livre.new
a.titre = Lusage du monde
a.auteur = Nicolas Bouvier SQL gnr
a.isbn = 222889401X INSERT INTO livres ("isbn", "auteur",
a.save "titre") VALUES('222889401X', 'Nicolas
Bouvier', 'L''usage du monde')
Rien de magique
Les mthodes save ou find ne font que masquer le dialogue avec la base de donnes.
On peut aussi utiliser des mthodes find_by_auteur ou find_by_titre. Rails reconnatra les formes en
find_by_xxx et les traduira en requtes sur le champ correspondant : le dynamisme de Ruby en action.
O. Gutknecht 2006
Associations
usagers
emprunts
class Emprunt < ActiveRecord::Base
id usager_id livre_id sortie retour
belongs_to :usager
... ... ... ...
belongs_to :livre
end
Indicateurs et conventions
Ces marqueurs permettent de clarifier un modle complexe, de donner Rails de quoi
construire et optimiser les requtes SQL sous-jacentes, en supposant quelques conventions
dcriture (ici usager_id et livre_id pour reprsenter les associations dans la table).
O. Gutknecht 2006
u = Usager.find_by_nom("Enoch Root",
:include => :emprunts) SELECT usagers.id, usagers.nom, usagers.adresse,
emprunts.id, emprunts.sortie, emprunts.retour,
emprunts.livre_id, emprunts.usager_id FROM usagers
LEFT OUTER JOIN emprunts ON emprunts.usager_id =
usagers.id WHERE (usagers.nom = 'Enoch Root')
u.emprunts[0].sortie (rien)
bookID titre auteur isbn ... et toutes mes tables ont un prfixe ?
... ... ... ...
... et mes index ont un nom spcifique ?
Les conventions sont l pour faciliter le cas gnral, et non rendre impossible le cas particulier.
Mettre en place les
Contrleurs
ActionController
Serveur Web
views/livre/exemple.rhtml controllers/livre_controller.rb
L encore, il est possible de passer outre ces conventions, moyennant un peu de code supplmentaire.
http://exemple.com/usager/liste
http://exemple.com/usager/fiche/4212
Contrleur Action Paramtre
def fiche
@usager = Usager.find(@params["id"])
end
end
app/controllers/usager_controller.rb
Paramtres
Une fois extraits le contrleur et l'action, le reste de l'URL - si prsent - sera vu comme des
paramtres supplmentaires stocks dans un dictionnaire et prt tre utiliss par le contrleur
On peut ainsi exploiter de la mme manire des requtes complexes POST ou GET (de la forme ?a=b)
O. Gutknecht 2006
Une navigation
http://exemple.com/usager/liste http://exemple.com/emprunt/nouveau/2 http://exemple.com/emprunt/creer/...
Contrleur: usager Action: liste Contrleur: emprunt Action: nouveau Contrleur: emprunt Action: creer
Paramtre: 2 (ID usager) Paramtres: Ubik (titre), 2 (ID usager)
obtention de la liste des utilisateurs
Obtient les informations sur lutilisateur et ses Rcupre les informations de formulaire,
emprunts courants, vrifie sil a le droit vrifie la validit (obtient lobjet livre), instancie
demprunter et enregistre un objet emprunt.
Vue: usager/liste.rhtml
Redirige ensuite vers un autre contrleur
Usagers
Vue: usager/fiche.rhtml
Enoch Root - 12, Bletchley Park [Editer]
3 livres emprunts
Lenchanement dun contrleur lautre se Snow Crash - le 12/02/45 (retard)
fait suite des actions de lutilisateur, ou Quicksilver - le 02/05/06
Ubik - le 05/08/06
selon la logique dun contrleur
[Sommaire] [Emprunt] [Usagers] [Livres]
O. Gutknecht 2006
ActionView
Utilise le principe de gabarits de pages
HTML avec un peu de code inclus
(fichiers .rhtml)
Les donnes du contrleur sont
automatiquement transmises la vue
Les liens entre les pages, les formulaires
sexpriment l encore en tant que
contrleurs et actions
O. Gutknecht 2006
Inclure du code
<html><body>
<h1>Usager: <%= @usager.nom %> </h1>
<h1>Livres emprunts</h1>
<% for l in @usager.emprunts %>
<%= l.titre %>: <%= l.auteur %> <br>
<% end %>
</body></html>
Parfait pour les tests, les boucles, et Parfait pour afficher les informations
tous les petits traitements transmises par le contrleur
O. Gutknecht 2006
Afficher linformation
<html><body>
<h1>Usager: <%= @usager.nom %> </h1>
<h1>Livres emprunts</h1>
<% for l in @usager.emprunts %>
<%= l.titre %>: <%= l.auteur %> <br>
<% end %>
</body></html>
On parcourt simplement ici les emprunts dun usager, mais ce qui est
manipul ici est bel et bien un modle ActiveRecord qui rend transparent
laccs la base de donnes, comme vu prcdemment
O. Gutknecht 2006
Gnrer un lien
Vue RHTML
HTML gnr
Les outils de Rails (gnrateurs de code, serveur de test) sont conus dans cet esprit.
O. Gutknecht 2006
application.rb
controllers livre_controller.rb
usager_controller.rb
livre.rb
app models
usager.rb
config editer.rhtml
views livre
doc nouveau.rhtml
usager
public nouveau.rhtml
livre_controller_test.rb
tmp functional
usager_controller_test.rb
test integration
livre_test.rb
unit
usager_test.rb
Guider le dveloppeur
Rails fournit de nombreux scripts permettant la gnration de squelettes de code. Tous ces
outils se basent sur les conventions de nommage et dorganisation de fichiers de Rails.
Les chafaudages
Au dbut du dveloppement dune application Web, il est
frquent davoir besoin de crer/afficher/modifier/dtruire des
lments du modle (CRUD: Create/Read/Update/Delete)
En dveloppement
diter/complter les
Gnrer un squelette de code
contrleurs, modles ou vues
Ruby
ou
RHTML
Tester
lapplication
Corriger une erreur
En dveloppement, Rails fonctionne avec son
propre mini-serveur Web: WEBrick.
En dploiement
De nombreuses options possibles
Serveurs
dapplication CGI FastCGI SCGI
Aide au dploiement
Capistrano
RAILS
Ne pas se rpter !
Rails fournit au dveloppeur larchitecture et les outils ncessaires pour
viter de dupliquer inutilement du code. lui de jouer le jeu jusquau bout.
Rfrences
PragmaticProgrammers OReilly Manning Publications
http://rubyonrails.org/books
O. Gutknecht 2006
Rfrences
http://www.rubyonrails.org/
Site officiel de Rails : documentation, weblog,
downloads, wiki et howtos, APIs, bugtracker...
http://www.railsfrance.org/
Site Rails francophone : forums, liens,
traductions, tutoriaux, actualit...
http://www.ruby-lang.org/
Site principal sur Ruby : FAQ,
documentation, tutoriaux, projets Ruby...
http://www.rubyforge.org/
Repository de projets Ruby Open
Source, base de donnes de projets
O. Gutknecht 2006
O. Gutknecht 2006
CC
Creative Commons
http://creativecommons.org/licenses/by-nc-nd/2.0/fr/
Vous tes libres de reproduire, distribuer et communiquer cette cration au public selon les conditions suivantes:
chaque rutilisation ou distribution, vous devez faire apparatre clairement aux autres les conditions contractuelles
de mise disposition de cette cration.
Si vous dsirez utiliser cette prsentation sous dautres conditions, merci de me contacter:
Olivier Gutknecht - olg @ no-distance.net