Sie sind auf Seite 1von 41

O.

Gutknecht 2006

Ruby on Rails

Une (courte) introduction

Olivier Gutknecht

O. Gutknecht 2006

(Ruby on) Rails ?


Un framework pour les applications Web crit avec et grce Ruby Invent par David Heinemeier Hansson Souple, intgr, dynamique, lgant,
productif... agile

O. Gutknecht 2006

Ruby (on Rails) ?


Un langage de script objet, trs dynamique, trs souple, avec une syntaxe lgante, qui reprend les bonnes ides de Smalltalk, Lisp, ou Perl Quelques petites indications sur la syntaxe de Ruby, sufsantes pour ce qui va suivre
Le rajout dune fonctionnalit tracer (dnie autre part) dans cette classe. :tout indique un symbole ( voir un peu comme une chane constante) On cre un objet de classe Bonjour. @ dsigne une variable dinstance (nul besoin de les dclarer avant) Envoie le message saluer lobjet @message (avec le paramtre a). Envoyer un message sur un objet ou sur une classe utilise la mme syntaxe. Ruby tant un langage trs dynamique, on a souvent tendance parler denvoi de message plutt que dappel de mthode.

class Essai < AutreClasse tracer :tout def exemple


@message = Bonjour.new amis = Copains.liste for a in amis @message.saluer(a) end end end

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

Rails concilie souplesse de dveloppement et attention porte larchitecture des applications

Trs structur, cadre les architectures, infrastructures puissantes Complexe, lourd, long matriser, difcile adapter, multiples couches
Pour caricaturer: le monde J2EE

Un petit exemple (fonctionnel) pour commencer


Afcher tous les livres dune bibliothque stocks dans une base de donnes quand lutilisateur navigue sur...

O. Gutknecht 2006

class Livre < ActiveRecord::Base end


id 1 2 titre Lusage du monde Le seigneur des porcheries auteur Nicolas Bouvier Tristan Egolf isbn 222889401 2070414736

class LivreController < ApplicationController def exemple


end @etagere = Livre.find(:all) end

<html><body> <h1>Tous les livres...</h1> <% for l in @etagere %>


<%= l.titre %>: <%= l.auteur %><br> <% end %> </body></html>

(4 lignes de plus si lon compte le chier congurant laccs la base de donnes)

3 chiers, 12 lignes de code, ralis sans trucage

O. Gutknecht 2006

Modle(s) Reprsente les donnes de lapplication, masque le dialogue avec la base


(des chiers contenant des classes Ruby)

Contrleur(s) Gre la logique de la navigation, choisit quelles informations transmettre la vue


(des chiers contenant des classes Ruby)

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

titre Lusage du monde Le seigneur des porcheries

auteur Nicolas Bouvier Tristan Egolf

isbn 222889401 2070414736


Les ranges sont reprsentes comme des objets

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

Nul besoin de se rpter


Rails interrogera la base pour obtenir la structure de la table et enrichir la classe.

Tirer parti de conventions


Une colonne id sera suppose tre lindex principal. Une classe Livre correspondra la table Livres (au pluriel). Les colonnes titre, auteur, isbn deviendront des attributs de la classe.

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')

b.find(1) puts b.auteur b.destroy


Afchera Nicolas Bouvier

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

class Usager < ActiveRecord::Base has_many :emprunts end

id ...

nom ...

adresse ...
livres

class Livre < ActiveRecord::Base has_many :emprunts end

id ...

titre ...

auteur ...

isbn ...

emprunts

class Emprunt < ActiveRecord::Base belongs_to :usager belongs_to :livre end

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

Sous le capot (bis)


Rails u = Usager.find_by_nom("Olivier Gutknecht") SQL gnr SELECT * FROM usagers WHERE (usagers."nom" = 'Olivier Gutknecht' ) u.emprunts[0].sortie u.emprunts[0].retour SELECT * FROM emprunts WHERE (emprunts.usager_id = 1)

(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

Oui, mais si...


lib2_book

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

class Livre < ActiveRecord::Base set_primary_key "bookID" end

ActiveRecord::Base.table_name_prefix = "lib2_" ActiveRecord::Base.pluralize_table_names = false

Livre.find_by_sql(SELECT * FROM livres WHERE auteur = Nicolas Bouvier)

Convention nest pas interdiction !


Il reste possible de prciser des comportements diffrents table par table, globalement, de revenir des requtes construites la main, sans perdre les autres avantages de Rails. Les conventions sont l pour faciliter le cas gnral, et non rendre impossible le cas particulier.

Mettre en place les Contrleurs


ActionController

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

<html> <body> <%= @info ... > </body> </html>

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

class UsagerController < ApplicationController


def liste

@usagers = Usager.find_all
end
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

Que trouver dans un contrleur ?


La logique de lapplication...

... prparer des donnes pour une page, et le faire diffremment pour un utilisateur identi ou anonyme ... recevoir les rsultats dun formulaire HTML pour enregistrer des donnes, et immdiatement rediriger vers une autre page ... vrier quun utilisateur est identi et si non, le rediriger vers la page idoine

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

Quelques autres outils


Rails

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

Crer des Vues


ActionView

O. Gutknecht 2006

ActionView
Utilise le principe de gabarits de pages
HTML avec un peu de code inclus (chiers .rhtml)

Les donnes du contrleur sont

automatiquement transmises la vue sexpriment l encore en tant que contrleurs et actions

Les liens entre les pages, les formulaires

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>

<% ... %>


Le code Ruby lintrieur de ce tag sera excut, mais le rsultat ne sera pas plac dans la page HTML Parfait pour les tests, les boucles, et tous les petits traitements

<%= ... %>


Le code Ruby lintrieur de ce tag sera excut, et le rsultat sera inclus dans la page HTML Parfait pour afcher les informations transmises par le contrleur

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>

Usager: Olivier Gutknecht Editer cette che Liste des livres

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

Le priple dun formulaire


http://exemple.com/livre/editer/42
@params = {:id => 42}
@params = {:id => 42, :livre => {:titre => "1984", :auteur => "George Orwell"}}

def editer @livre = Livre.find(params[:id]) end


controllers/livre_controller.rb

<%= form_tag :action => 'sauver', :id => @livre %> <%= text_field 'livre', 'titre' %> <%= text_field 'livre', 'auteur' %> <%= submit_tag "Sauver"%> <%= end_form_tag %>
views/livre/editer.rhtml

def sauver l = Livre.find(params[:id]) l.update_attributes(params[:livre]) l.save end


controllers/livre_controller.rb

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

Dvelopper avec Ruby on Rails

O. Gutknecht 2006

Limportance des -cts


Structurer le plus possible lapplication Encourager les bonnes pratiques

Migration de schmas, tests unitaires, nommage et placement des chiers

Mme via lorganisation du projet sur le disque

Faciliter un dveloppement rapide et itratif


Mode de dveloppement live, chafaudages
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 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

Bases de donnes supportes

sqlite Oracle

MySQL SQL Server DB2

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

Les 2 cls de 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.

Plutt convention que conguration !


Rails part du principe que le comportement le plus courant doit tre celui qui ne ncessite aucun code ou conguration, quitte pouvoir le changer sil ne convient pas.

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

Rails - Une (courte) Introduction - v1.0.3

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:

Paternit : Vous devez citer le nom de l'auteur original.

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

Das könnte Ihnen auch gefallen