Vous êtes sur la page 1sur 26

Ruby on Rails

Une (courte) introduction

(Ruby on) Rails ?


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

Pourquoi Ruby?

Les defauts

Ruby

100% objet, pas de primitives langage concis et lisible : moins de code, moins de bugs langage dynamique, fortement typ imprgn des mthodes de tests TDD et BDD (nombreux frameworks disponibles) Ruby en ligne de commande (IRB), pratique pour des essais, Rubygems : gestionnaire de paquets additionnels

vitesse dapprentissage
syntaxe et idiomes riches et avancs meta-programmation inspir des meilleurs langages reconnus : Smalltalk, Lisp, Python, Perl, forte implication et marques de confiance des tnors : IBM, Sun, Apple, Microsoft, SAP, de nombreux frameworks de premier plan : Rails, Sinatra,

Rails

ddi au dveloppement dappli web


architecture MVC naturellement REST forte incitation DRY convention plutt que configuration grand varit de helpers des outils annexes trs utiles : dbuggage, dploiement, monitoring,

des environnements dexcution bien dfinis et cloisonns


WebServices-friendly systme strict de migration des bases de donnes framework complet accessible en ligne de commande communaut trs active documentation riche (en ligne, livres, )

O.Gutknecht 2006

Pourquoi Rails ?
Prendre le meilleur des deux grandes faons de faire des applicationsWeb 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 @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>

(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

Reprsente les donnes de lapplication, masque le dialogue avec la base

(des chiers contenant des classes Ruby)

Modle(s)

Gre la logique de la navigation,choisit quelles informations transmettre la vue

(des chiers contenant des classes Ruby)

Contrleur(s)

Permet dlaborer des modles de pages web et dy inclure les donnes reues
MVC : un modle classique... ...pour les applications clientes,mais assez rarement mis en uvre dune manire aussi lgante dans les systmes de dveloppementWeb

(des chiersrhtml:des pages HTML avec du code Ruby)

Vue(s)

O.Gutknecht 2006

Modle(s) ActiveRecord

+
Contrleur(s) ActionController

+
+

Ruby on Rails

Vue(s) ActionView

Outils supplmentaires WebServices,Mail,IntgrationAJAX...

Dnir le Modle
ActiveRecord

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

RAILS

Le dveloppeur respecte quelques conventions de nommage


Des indications peuvent tre ajoutes pour guider Rails (validations,associations...)

Les moteursWeb o la structure des donnes nest jamais explicite et se retrouve dissmine dans tout le code de lapplication

Les moteursWeb o la structure des donnes de la base doit tre rexplicite dans des chiers de conguration du moteur

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

SELECT * FROM livres WHERE (livres.id


AfcheraNicolas Bouvier

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

Mettre en place les Contrleurs


ActionController

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

Crer des Vues


ActionView

ActionView
Utilise le principe degabarits de pages
Les donnes du contrleur sont
HTML avec un peu de code inclus (chiers .rhtml) automatiquement transmises la vue

Les liens entre les pages,les formulaires


sexpriment l encore en tant que contrleurs et actions

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

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

Dvelopper avec Ruby on Rails

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.

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-serveurWeb:WEBrick. Dans ce mode,changer quelque chose dans lapplication ne demande que deux choses pour tre pris en compte : sauver le chier,recharger la pageWeb.

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

En dploiement
De nombreuses options possibles
ServeursWeb Serveurs dapplication

Lighttpd

Apache1

Apache2

Mongrel

CGI

FastCGI
RAILS

SCGI
Capistrano

Aide au dploiement

Bases de donnes supportes

sqlite

MySQL

PostgreSQL

Oracle

SQL Server

DB2

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 serveurApache pour dlivrer le contenu statique de lapplication,et un modproxy vers un lighttpd ou un mongrel pour laspect dynamique

Utilisation