Beruflich Dokumente
Kultur Dokumente
Gutknecht 2006
Ruby on Rails
Olivier Gutknecht
O. Gutknecht 2006
O. Gutknecht 2006
Dnition dune nouvelle classe Essai hritant de la classe AutreClasse Dnition dune nouvelle mthode exemple Quand un appel de mthode na pas de paramtre, on omet dhabitude le () amis et a sont des variables locales (nul besoin de les dclarer avant usage)
O. Gutknecht 2006
Cette introduction ?
Un coup dil gnral Les 3 piliers de Rails Dvelopper avec Rails
Le Modle : ActiveRecord La Vue : ActionView Le Contrleur : ActionController
O. Gutknecht 2006
Pourquoi Rails ?
Prendre le meilleur des deux grandes faons de faire des applications Web Interactif, rapide, facile apprendre, peu de contraintes, trs souple Peu structur, dur maintenir, pas de sparation entre logique et rendu
Pour caricaturer: le monde PHP
RAILS
Trs structur, cadre les architectures, infrastructures puissantes Complexe, lourd, long matriser, difcile adapter, multiples couches
Pour caricaturer: le monde J2EE
O. Gutknecht 2006
O. Gutknecht 2006
Vue(s) Permet dlaborer des modles de pages web et dy inclure les donnes reues
(des chiers rhtml : des pages HTML avec du code Ruby)
MVC : un modle classique... ... pour les applications clientes, mais assez rarement mis en uvre dune manire aussi lgante dans les systmes de dveloppement Web
O. Gutknecht 2006
Modle(s) ActiveRecord
+
Contrleur(s) ActionController
+
Vue(s) ActionView
Ruby on Rails
+
Outils supplmentaires WebServices, Mail, Intgration AJAX...
Dnir le Modle
ActiveRecord
O. Gutknecht 2006
ActiveRecord
Les tables correspondront des classes Ruby Les colonnes sont exprimes en attributs de la classe
livres
id 1 2
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)
Rails interroge la base de donnes pour en dcouvrir la structure Le dveloppeur respecte quelques conventions de nommage Des indications peuvent tre ajoutes pour guider Rails (validations, associations...)
RAILS
Rails essaie de naviguer entre deux cueils classiques Les moteurs Web o la structure des donnes nest jamais explicite et se retrouve dissmine dans tout le code de lapplication Les moteurs Web o la structure des donnes de la base doit tre rexplicite dans des chiers de conguration du moteur
O. Gutknecht 2006
Exemple
id ...
SQL
titre ...
livres
auteur ...
isbn ...
Rails
CREATE TABLE livres ( id int(11) NOT NULL auto_increment, titre varchar(255), auteur varchar(255), isbn varchar(13), PRIMARY KEY (id));
class Livre < ActiveRecord::Base end La classe de base de tous les modles ActiveRecord
O. Gutknecht 2006
Sous le capot
Ruby
class Livre < ActiveRecord::Base end a = Livre.new a.titre = Lusage du monde a.auteur = Nicolas Bouvier a.isbn = 222889401X a.save
SQL gnr
INSERT INTO livres ("isbn", "auteur", "titre") VALUES('222889401X', 'Nicolas Bouvier', 'L''usage du monde')
SELECT * FROM livres WHERE (livres.id = '1') LIMIT 1 DELETE FROM livres WHERE id = 1
Rien de magique Les mthodes save ou nd ne font que masquer le dialogue avec la base de donnes. On peut aussi utiliser des mthodes nd_by_auteur ou nd_by_titre. Rails reconnatra les formes en nd_by_xxx et les traduira en requtes sur le champ correspondant : le dynamisme de Ruby en action.
O. Gutknecht 2006
Associations
usagers
id ...
nom ...
adresse ...
livres
id ...
titre ...
auteur ...
isbn ...
emprunts
id ...
usager_id ...
livre_id ...
sortie ...
retour
Indicateurs et conventions Ces marqueurs permettent de clarier 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
(rien)
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)
Rails la tche doptimiser les requtes, cacher les rsultats Au dveloppeur la responsabilit de donner sufsamment dindications sur lusage voulu (par exemple ici le :include) pour guider Rails
O. Gutknecht 2006
... ma base existait dj ? ... et toutes mes tables ont un prxe ? ... et mes index ont un nom spcique ? ... je dois faire une requte bien particulire ?
bookID ...
titre ...
auteur ...
isbn ...
Serveur Web
Rails - Aiguillage Initial LURL est dissque pour trouver le contrleur et sa mthode, ainsi que la vue qui en fera le rendu nal
views/livre/exemple.rhtml
controllers/livre_controller.rb
class LivreController < ApplicationController def exemple @info = ... end end
Encore des conventions ! Cette faon daiguiller une requte permet de simplier le travail du concepteur de l'application : il y a juste respecter des rgles simples de nommage de chiers et de mthodes. 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/che/4212
Contrleur Action Paramtre
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
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 obtention de la liste des utilisateurs Contrleur: emprunt Action: nouveau Paramtre: 2 (ID usager) Obtient les informations sur lutilisateur et ses emprunts courants, vrie sil a le droit demprunter Contrleur: emprunt Action: creer Paramtres: Ubik (titre), 2 (ID usager) Rcupre les informations de formulaire, vrie la validit (obtient lobjet livre), instancie et enregistre un objet emprunt. Redirige ensuite vers un autre contrleur
Vue: usager/liste.rhtml Usagers Olivier Gutknecht [Fiche] [Nouvel Emprunt] Enoch Root [Fiche] [Nouvel Emprunt]
Vue: emprunt/nouveau.rhtml Nouvel emprunt Enoch Root 2 livres emprunts Snow Crash - le 12/02/45 (retard) Quicksilver - le 02/05/06 Nouvel emprunt:
http://exemple.com/usager/che/2
Contrleur: usager Action: che Paramtre: 2 (ID usager) Obtient les informations sur lutilisateur et ses emprunts courants
Ubik
Vue: usager/che.rhtml
Lenchanement dun contrleur lautre se fait suite des actions de lutilisateur, ou selon la logique dun contrleur
Enoch Root - 12, Bletchley Park [Editer] 3 livres emprunts Snow Crash - le 12/02/45 (retard) Quicksilver - le 02/05/06 Ubik - le 05/08/06 [Sommaire] [Emprunt] [Usagers] [Livres]
O. Gutknecht 2006
class UsagerController < ApplicationController before_filter :autoriser, :only => :nouveau after_filter :compression caches_action :liste def nouveau if request.get? @usager = Usager.new else @usager = Usager.new(params[:usager]) @usager.save cookies[:nom] = @usager.nom redirect_to :action => "liste" end end def liste ...
On peut se servir des ltres rutilisables pour tout ou partie dun contrleur, appliqus avant ou aprs le traitement de la requte Une politique de cache peut tre dnie comme ici sur une action prcise, mais aussi au niveau dune page complte ou dun fragment
Rails transmet la requte complte au contrleur, on peut donc regrouper dans la mme action deux traitements diffrents, selon que lon examine un GET ou un POST: typiquement pour gnrer un formulaire, ou en traiter le rsultat Les cookies sont grs par Rails et transmis prt lusage au contrleur. La session de travail de lutilisateur est garde et manipulable exactement de la mme manire
Mme ces aspects trs transversaux sexpriment encore dans ce mme principe de contrleur/action
O. Gutknecht 2006
ActionView
Utilise le principe de gabarits de pages
HTML avec un peu de code inclus (chiers .rhtml)
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>
O. Gutknecht 2006
Afcher 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>
Les variables commenant par @ sont celles dnies dans le contrleur, et Rails va automatiquement les rendre accessibles la vue. 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
Usager: <%= @usager.nom %> <br> <%= link_to("Editer cette fiche", :action => "editer", :id => @usager) %><p> <%= link_to("Liste des livres", :controller => livre, :action => liste)%>
HTML gnr
Usager: Olivier Gutknecht <br> <a href="/usager/editer/1">Editer cette fiche</a> <p> <a href="/livre/liste">Liste des livres</a>
Les outils de gnration de liens Mme dans une vue, Rails permet de continuer travailler dans ce mme univers de contrleur / action / paramtres.
On peut ainsi exprimer les liens un niveau plus abstrait et saffranchir de la gestion des URL. Cela permet galement de simplier lcriture (par exemple, le contrleur courant peut tre omis).
O. Gutknecht 2006
<%= form_tag :action => 'sauver', :id => @livre %> <%= text_field 'livre', 'titre' %> <%= text_field 'livre', 'auteur' %> <%= submit_tag "Sauver"%> <%= end_form_tag %>
views/livre/editer.rhtml
Une belle coopration entre modle, contrleur et vue text_eld, form_tag... : ces mthodes spcialises (helpers) permettent de construire facilement des formulaires prremplis selon les donnes du modle et den transmettre les modications au contrleur sous une forme immdiatement exploitable.
<form action="/livre/sauver/42" method="post"> <input name="livre[titre]" value=1984> <input name="livre[auteur]" value=George Orwell> <input type="submit" value="Sauver"> </form>
Code HTML gnre
O. Gutknecht 2006
O. Gutknecht 2006
application.rb
controllers
livre_controller.rb
usager_controller.rb
livre.rb app models usager.rb cong views doc livre nouveau.rhtml editer.rhtml
bibliotheque
log usager public livre_controller_test.rb tmp functional usager_controller_test.rb test integration livre_test.rb unit usager_test.rb
editer.rhtml
nouveau.rhtml
Structure dun projet La sparation de lapplication entre modles, vues, contrleurs, tests, plugins, congurations, logs, etc. est immdiatement visible.
O. Gutknecht 2006
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 chiers de Rails.
Script de gnration de projet (structure de rpertoires, chiers de conguration initiaux...) Script de gnration de modle (squelette de code applicatif, squelette de code de test, conguration du test...)
$ script/generate model usager
exists app/models/ exists test/unit/ exists test/xtures/ create app/models/usager.rb create test/unit/usager_test.rb create test/xtures/usagers.yml exists db/migrate create db/migrate/002_create_usagers.rb
Script de gnration de contrleur (Squelette de code applicatif, squelette du code de test, rpertoire des vues...)
$ script/generate controler usager
$ rails bibliotheque
create create create create create create app/controllers app/helpers app/models app/views/layouts cong/environments
[...]
exists app/controllers/ exists app/helpers/ create app/views/usager exists test/functional/ create app/controllers/usager_controller.rb create test/functional/usager_controller_test.rb create app/helpers/usager_helper.rb
[...]
create doc create log create public/images create public/javascripts create public/stylesheets create script/performance create script/process create test/functional create test/integration create test/unit create create create create tmp/sessions tmp/cache Rakele README
Rails fournit par dfaut un certain nombre de gnrateurs de code (modle, contrleur, webservice, mailer...) mais permet aussi dintgrer facilement un grand nombre de plugins: authentication, statistiques, graphes, outils AJAX...
O. Gutknecht 2006
Les chafaudages
Au dbut du dveloppement dune application Web, il est frquent davoir besoin de crer/afcher/modier/dtruire des lments du modle (CRUD: Create/Read/Update/Delete) Le gnrateur dchafaudages (scaffolding) de Rails produit automatiquement un contrleur et des vues - simplistes - mais immdiatement fonctionnelles pour un modle donn.
$ script/generate scaffold Livre
exists app/controllers/ exists app/helpers/ create app/views/livres exists test/functional/ exists app/models/ exists test/unit/ exists test/xtures/ create app/models/livre.rb create test/unit/livre_test.rb create test/xtures/livres.yml create app/views/livres/_form.rhtml create app/views/livres/list.rhtml create app/views/livres/show.rhtml create app/views/livres/new.rhtml create app/views/livres/edit.rhtml create app/controllers/livres_controller.rb create test/functional/livres_controller_test.rb create app/helpers/livres_helper.rb create app/views/layouts/livres.rhtml create public/stylesheets/scaffold.css
Itrer, toujours Rails incite avoir des tapes de dveloppement rapproches, o lapplication reste le plus possible fonctionnelle
Lchafaudage (i.e. les diffrentes actions du contrleurs et les vues) sera retir au fur et mesure, au prot du code dnitif.
O. Gutknecht 2006
En dveloppement
Gnrer un squelette de code diter/complter les contrleurs, modles ou vues Ruby ou RHTML
Corriger une erreur En dveloppement, Rails fonctionne avec son propre mini-serveur Web: WEBrick. Dans ce mode, changer quelque chose dans lapplication ne demande que deux choses pour tre pris en compte : sauver le chier, recharger la page Web.
Tester lapplication
RAILS
En traitant les requtes, Rails vriera que les chiers sont jour, et si besoin, rechargera dynamiquement le code, sans avoir relancer lapplication ou le serveur
O. Gutknecht 2006
En dploiement
De nombreuses options possibles
Serveurs Web Serveurs dapplication
Lighttpd CGI
Apache1 FastCGI
RAILS
Apache2 SCGI
Mongrel
Aide au dploiement
Capistrano
sqlite Oracle
PostgreSQL FireBird
Faciliter lexprimentation Rails permet de travailler dans des environnements (test, production, dveloppement...) isols o les comportements de cache et les congurations de bases de donnes peuvent rester distincts.
Assembler le puzzle Il est tout fait possible de combiner ces solutions, par exemple un serveur Apache pour dlivrer le contenu statique de lapplication, et un modproxy vers un lighttpd ou un mongrel pour laspect dynamique
O. Gutknecht 2006
O. Gutknecht 2006
Rfrences
PragmaticProgrammers OReilly Manning Publications
vo - PragmaticProgrammers
vf - Editions Eyrolles
OReilly
APress
http://rubyonrails.org/books
O. Gutknecht 2006
Rfrences
http://www.rubyonrails.org/ Site ofciel 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:
BY:
Pas d'Utilisation Commerciale : Vous n'avez pas le droit d'utiliser cette cration des ns commerciales. Pas de Modication : Vous n'avez pas le droit de modier, de transformer ou d'adapter cette cration.
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