Présentation de Ruby on Rails
Rencontres Mondiales du Logiciel Libre,Mont-de-Marsan, vendredi 4 juillet 2008
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Guillaume “Zifro” DESRAT<[email protected]> && http://zlab.fr/
• Rubyiste depuis 2002• Railer depuis 2005
• Président de l’association (http://www.rubyfrance.org/)
• participe aux discussions sur les listes RubyFR et RailsFrance• répond à vos questions sur #rubyfr @ irc.freenode.net
• consultant informatique au Luxembourg• en mission chez une banque d’investisseurs
Avant-propos :: présentation de l’orateur
Présentation de Ruby on Rails
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
• un tour d’horizon de Ruby on Rails• les concepts, les principes mis en oeuvre• un aperçu du code
Rencontres Mondiales du Logiciel Libre,Mont-de-Marsan, vendredi 4 juillet 2008
Avant-propos :: objet de la conférence
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails, c’est :
• un framework pour développer des applications Web• écrit en Ruby• basé sur le concept MVC• orienté conventions plutôt que configuration
• libre ! disponible sous licence MIT
Qu’est-ce que Ruby on Rails ?
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails, c’est :
• le travail (entre autres !) de David Heinemeier Hansson• la version 1.0 en décembre 2005• la version 2.0 en décembre 2007
• un noyau allégé• plus de fonctionnalités sous forme de plugins• REST
• une version 2.1 le 1er juin 2008• des efforts sur la gestion des TimeZone• les “Dirty Objects” (gestion des modifications)
Qu’est-ce que Ruby on Rails ?
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
MVC
Ruby on Rails : basé sur MVC
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Modèle - Vue - Contrôleur
• un modèle pour la persistance des données• une vue pour l’interface utilisateur• un contrôleur pour coordonner le tout
• une idée de Trygve Reenskaug, en... 1979
• initialement pensé pour les applications de bureau• adapté au Web par la suite
Ruby on Rails : basé sur MVC
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Architecture MVC pour le Web :
Navigateur
Base de données
Vue
Contrôleur6
5
4
3
2
1
Modèle
Ruby on Rails : basé sur MVC
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : basé sur MVC
Des URL différentes :
http://zlab.fr/books/show/1
• site Web : zlab.fr• contrôleur : Books• action : show• un paramètre, id, qui vaut 1
• une convention ( ), paramétrable
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : des conventions ( )
Conventionsvs.
Configuration
development:
adapter: oci
username: zifro
password: rubycl
eschlop
host: SERVER
# Warning: The dat
abase defined as '
test' will be eras
ed and
# re-generated fro
m your development
database when you
run 'rake'.
# Do not set this
db to the same as
development or pro
duction.
test: adapter
: oci
username: zifro
password: ecrive
z-des-tests
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : des conventions ( )
Ruby on Rails privilégie l’utilisation de conventions plutôt que l’emploi de fichiers de configuration :
• des comportements par défaut qui se posent en standard• moins de code, donc moins d’erreurs possibles• des conventions que l’on peut ignorer, au besoin
Un fichier de configuration tout de même, pour la connexion aux bases de données (format YAML)
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : des conventions ( )
Architecture sur le disque :
• une structure de fichiers complète
• MVC : séparation des modèles, vues et contrôleurs
zlab.fr:~/rmll zifro$ ls demoREADME config lib script vendorRakefile db log test app doc public tmp
zlab.fr:~/rmll zifro$ ls demo/appcontrollers helpers models views
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : basé sur MVC
ActiveRecord
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveRecord
ActiveRecord, c’est :
• le M dans MVC
• un Object Relational Mapper• les tables sont représentées par des classes• les enregistrements par des objets• les champs par des attributs
id title author
1 The Ruby Way Hal Fulton
2 Ruby for Rails David A. Black
Table “Books”
<Book>id = 1title = ‘The Ruby Way’author = ‘Hal Fulton’
<Book>id = 2title = ‘Ruby for Rails’author = ‘David A. Black’
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveRecord
Définition du modèle “Book”, pour représenter les livres enregistrés dans la base de données :
class Book < ActiveRecord::Baseend
• convention : une classe correspond à une table portant le même nom au pluriel• inutile de définir les attributs, ActiveRecord les lit directement dans la base de données
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveRecord
On ne manipule que des objets Ruby : • création d’un objet :
• initialisation de ses attributs :
• lecture des attributs :
• sauvegarde de l’objet :
• création et sauvegarde :
• suppression :
b = Book.new
b.title = 'Agile Web Development with Rails'b.author = 'Dave Thomas & David Heinemeier Hansson'
b.title # renvoie 'Agile Web Development with Rails'
b.save # renvoie true ou falseb.save! # lève une exception en cas d’erreur
b.create :title => 'Ruby in a Nutshell', :author => 'Matz'
b.delete
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveRecord
ActiveRecord, c’est aussi :
• des méthodes pour interroger les modèles (des “finders”)
id title author
1 The Ruby Way Hal Fulton
2 Ruby for Rails David A. Black
Table “Books” class Book < ActiveRecord::Baseend
b = Book.find 1b = Book.find :first, :conditions => ['title LIKE ?', '%Ruby%']b = Book.find :all, :conditions => ['title LIKE ?', '%Ruby%']b = Book.find_by_author 'Hal Fulton'b = Book.find_by_title 'Ruby for Rails'
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveRecord
ActiveRecord, c’est aussi :
• la description des relations entre les modèles
id title author category_id
1 The Ruby Way Hal Fulton 1
2 Ruby for Rails David A. Black 1
Table “Books”
id label
1 Computing
2 Fiction
Table “Categories”
class Book < ActiveRecord::Base belongs_to :categoryend
class Category < ActiveRecord::Baseend
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveRecord
Ce qui permet d’écrire :
b = Book.find_by_title 'Ruby for Rails'b.category.label
c = Category.find_by_label 'Fiction'
b = Book.create :title => 'Winter Hauntering', :author => 'Dan Simmons', :category_id => c.id
b = Book.newb.title = 'The man who disappears'b.author = 'Jeffery Deavers'b.category = cb.save
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveRecord
id title author category_id
1 The Ruby Way Hal Fulton 1
2 Ruby for Rails David A. Black 1
Table “Books”
id label
1 Computing
2 Fiction
Table “Categories”
class Book < ActiveRecord::Base belongs_to :categoryend
Pour traverser la relation depuis l’autre modèle :
class Category < ActiveRecord::Base has_many :booksend
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveRecord
Ce qui permet d’écrire :
c = Category.find_by_label 'Computing'c.books
b = Book.create :title => 'Hyperion', :author => 'Dan Simmons'
fiction = Category.find_by_label 'Fiction'fiction.books << bfiction.books.find :all,
:conditions => ['author = ?', 'Dan Simmons']
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveRecord
ActiveRecord, c’est aussi :
• des méthodes pour valider les données du modèle
class Book < ActiveRecord::Base
belongs_to :category
validates_presence_of :title, :author validates_length_of :title, :minimum => 2
def validate self.errors.add :author, ’Not actually an author’if self.author == 'Why the luck stiff' end
end
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : basé sur MVC
ActionView
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionView
ActionView, c’est :
• le V dans MVC
• un système de génération d’interface Web, avec :• des layouts (gabarits)• des pages qui s’intègrent dans les layouts• des balises spécifiques pour intégrer du code Ruby (eRB)• des fichiers .rhtml dans app/views/
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionView
Exemple de layout :
<html> <head> <title>RMLL : Ruby on Rails demo</title> </head> <body> <%= yield %> </body></html>
• permet de partager une charte graphique, une présentation, entre plusieurs pages• <%= yield %> est remplacé par le contenu de la vue qui est rendue
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionView
Exemple de vue :
• le code Ruby entre <% et %> est exécuté• le code Ruby entre <%= et %> est exécuté et sa sortie standard est écrite dans la vue
<h1>Titre du livre</h1>par <i>Auteur du livre</i>
<% date = Time.now %><% if date.hour < 12 %>page générée le matin du <% else %>page générée l'après-midi du <% end %><%= date.strftime '%d/%m' %>
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionView
Page générée :
<html> <head> <title>RMLL : Ruby on Rails demo</title> </head> <body> <h1>Titre du livre</h1> par <i>Auteur du livre</i> page générée l’après-midi du 04/07 </body></html>
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionView
La même vue, dynamique :
• la vue a accès aux variables du contrôleur• elle ne contient normalement aucune logique• si beaucoup de code est nécessaire pour un affichage, les helpers prennent le relais
<h1><%= @book.title %></h1>par <i><%= @book.author %></i>
<% date = Time.now %><% if date.hour < 12 %>page générée le matin du <% else %>page générée l'après-midi du <% end %><%= date.strftime '%d/%m' %>
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionView
L’autre facette d’ActionView :
• remplace avantageusement les <a>
• plus on utilise ActionView... moins on écrit d’HTML
<%= link_to 'Livre suivant', :controller => 'books', :action => 'show', :id => (params[:id] + 1) %>
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionView
ActionView, c’est aussi :
• la possibilité de faire de l’AJAX (classique et RJS)• la possibilité d’utiliser Prototype et script.aculo.us
• sans écrire une ligne de Javascript, seulement du Ruby
<%= link_to_remote "<h1>#{@book.title}</h1>", :update => 'author', :url => { :action => :update_author } %>par <i id="author">auteur</i>
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : basé sur MVC
ActionController
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionController
ActionController, c’est :
• le C dans MVC
• le chef d’orchestre• il contient la logique de l’application• il interroge le modèle• manipule les données récupérées• détermine la vue à afficher à l’utilisateur
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionController
Définition du contrôleur “Books”, pour afficher les livres enregistrés dans la base de données :
• le contrôleur est une classe• l’action est une méthode• le nom de l’action permet de déduire la vue à rendre
class BooksController < ApplicationController def show endend
Base de données
3
2 Modèle
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionController
Navigateur
Vue
Contrôleur6
5
4
1
http://zlab.fr/books/show/1
class BooksController < ApplicationController def show endend
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionController
Définition du contrôleur “Books”, pour afficher les livres enregistrés dans la base de données :
• le contrôleur interroge le modèle• à la fin de l’exécution, la vue est rendue, dans le layout
class BooksController < ApplicationController def show @book = Book.find params[:id] end end
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionController
Gestion d’un paramètre “id” qui puisse être inexistant dans la base de données :
class BooksController < ApplicationController def show begin @book = Book.find params[:id] render :layout => 'special' rescue redirect_to :controller => 'error', :action => 'raised',
:id => params[:id] end end end
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActionController
Suppression d’un livre :class BooksController < ApplicationController def show # ... end def delete @book = Book.find params[:id] if @book.delete redirect_to :action => 'list' else flash[:notice] = 'Erreur à la suppression' render :action => 'show' end end end
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails
ActiveSupport
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveSupport
ActiveSupport, c’est :
• le S dans Sympathique
• des extensions des classes de base de Ruby• pour simplifier le développement• améliorer la lisibilité du code
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ActiveSupport
1.kilobyte # => 10241.megabyte # => 1048576
2.days.before # => Fri Jul 02 16:37:16 +0200 20081.day.from_now # => Fri Jul 05 16:37:16 +0200 20087.days + 1.week # => 12096001.year / 1.day # => 365
nil.blank? # => true''.blank? # => true{}.blank? # => true[].blank? # => true
ActiveSupport, c’est :
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails
Mais encore ?(ce dont je n’ai pas le temps de vous parler)
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : mais encore ?
Ruby on Rails, c’est :
• un framework qui intègre les tests dès le départ
• ActionMailer
• des Web services REST• ActiveResource
• plusieurs systèmes de templating pour ActionView
• des plugins pour quasiment tout ce qui peut être nécessaire
• du code Ruby qu’il est bon de lire
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ruby on Rails : ressources
Ressources
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ressources en Anglais
Sites Web :• le site officiel Ruby on Rails (http://www.rubyonrails.org/)• le site officiel Ruby (http://www.ruby-lang.org/)• les sites et blogs axés “Web 2.0” (PeepCode, ...)
Listes de diffusion :• les listes officielles @rubyonrails.org• Ruby-Talk et Ruby-Core @ruby-lang.org
Groupe de discussion :• comp.lang.ruby
IRC :• #rubyonrails sur le réseau Freenode• #ruby-lang sur le même réseau
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ressources en Anglais
Livres :
• Agile Web Development with Rails, 2nd edition, (The Pragmatic Programmers)
• The Rails Way, Obie Fernandez (Addison-Wesley)
• Advanced Rails Recipes, Mike Clark (The Pragmatic Programmers)
• Programming Ruby, Dave Thomas (The Pragmatic Programmers)
• The Ruby Way, Hal Fulton (Addison Wesley)
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ressources en Français
Sites Web :• le portail RailsFrance (http://www.railsfrance.org/)• le portail RubyFrance (http://www.rubyfrance.org)• le site officiel Ruby, en Français (http://www.ruby-lang.org/fr/)• les nombreux blogs de la communauté francophone
• http://boldr.org/, de Nicolas Mérouze• http://frederic.logier.org/, de Frédéric Logier• http://blog.shingara.fr/, de Cyril Mougel• ...
Listes de diffusion :• RailsFrance, groupe Google (http://groups.google.com/)• RubyFR-public, groupe Google
Groupe de discussion :• fr.comp.lang.ruby
IRC :• #rubyonrails.fr et #rubyfr sur le réseau Freenode
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Ressources en Français
Livres :
• Ruby on Rails, 2ème édition, Dave Thomas & David Heinemeier Hansson (Eyrolles)
• Ruby et Rails, David A. Black (CampusPress)
• Pratique de Ruby on Rails, Eric Sarrion (O’Reilly)
• Recettes Rails, Chad Fowler (CampusPress)
• Ruby par l’exemple, Lucas Carlson & Leonard Richardson (O’Reilly)
• Débuter en programmation avec Ruby, Chris Pine (CampusPress)
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
C’est fini...
Des questions ?
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
C’est fini...
Merci !
RMLL 2008 - Présentation de Ruby on Rails - Guillaume “Zifro” DESRAT
Licence de ce document
Vous êtes libres de reproduire, distribuer et communiquer cette création au public, selon les conditions suivantes :
•Paternité• Vous devez citer le nom de l'auteur original de la manière indiquée par l'auteur de l'oeuvre ou le titulaire des droits qui vous confère cette autorisation
(mais pas d'une manière qui suggérerait qu'ils vous soutiennent ou approuvent votre utilisation de l'oeuvre)
•Pas d’utilisation commerciale• Vous n'avez pas le droit d'utiliser cette création à des fins commerciales
•Pas de modification• Vous n'avez pas le droit de modifier, de transformer ou d'adapter cette création.
•résumé explicatif disponible sur http://creativecommons.org/licenses/by-nc-nd/2.0/fr/
•vous êtes autorisés à réutiliser le logo Ruby France employé dans cette présentation, pour faire référence à l’association