présentation de ruby on rails -...
Post on 01-Mar-2019
228 Views
Preview:
TRANSCRIPT
Présentation deRuby on Rails
Nicolas CavigneauxJuillet 2007
1
Qui suis-je ?
Nicolas Cavigneaux
Ingénieur d’étude et développement chez webpulser
Spécialisé en Ruby
Amoureux de Rails
2
Ruby on Rails
3
Ruby on Rails
• Un framework pour les applications Web
3
Ruby on Rails
• Un framework pour les applications Web
• Écrit à l’aide de Ruby
3
Ruby on Rails
• Un framework pour les applications Web
• Écrit à l’aide de Ruby
• Inventé par David Heinemeier Hansson
3
Ruby on Rails
• Un framework pour les applications Web
• Écrit à l’aide de Ruby
• Inventé par David Heinemeier Hansson• Souple, élégant, dynamique, agile, productif,
complet, …
3
Ruby !
4
Ruby !
• À la base de Rails
4
Ruby !
• À la base de Rails• Langage de script objet
4
Ruby !
• À la base de Rails• Langage de script objet• Dynamique
4
Ruby !
• À la base de Rails• Langage de script objet• Dynamique• Souple
4
Ruby !
• À la base de Rails• Langage de script objet• Dynamique• Souple• Syntaxe élégante
4
Ruby !
• À la base de Rails• Langage de script objet• Dynamique• Souple• Syntaxe élégante• Inspiré de Smalltalk et Lisp
4
Et la syntaxe ?
5
Et la syntaxe ?class Voiture < Vehicule
def avancer(distance)deplacer(:avancer, distance)
distance.times do |i|klaxonner
endend
end
5
Et la syntaxe ?class Voiture < Vehicule
def avancer(distance)deplacer(:avancer, distance)
distance.times do |i|klaxonner
endend
end
Définition d’une classe
5
Et la syntaxe ?class Voiture < Vehicule
def avancer(distance)deplacer(:avancer, distance)
distance.times do |i|klaxonner
endend
end
Définition d’une classe
5
Et la syntaxe ?class Voiture < Vehicule
def avancer(distance)deplacer(:avancer, distance)
distance.times do |i|klaxonner
endend
end
Définition d’une classe
Définition d’une méthode
5
Et la syntaxe ?class Voiture < Vehicule
def avancer(distance)deplacer(:avancer, distance)
distance.times do |i|klaxonner
endend
end
Définition d’une classe
Définition d’une méthode
5
Et la syntaxe ?class Voiture < Vehicule
def avancer(distance)deplacer(:avancer, distance)
distance.times do |i|klaxonner
endend
end
Définition d’une classe
Définition d’une méthode
Appel de méthode avec deux paramètres
5
Et la syntaxe ?class Voiture < Vehicule
def avancer(distance)deplacer(:avancer, distance)
distance.times do |i|klaxonner
endend
end
Définition d’une classe
Définition d’une méthode
Appel de méthode avec deux paramètres
5
Et la syntaxe ?class Voiture < Vehicule
def avancer(distance)deplacer(:avancer, distance)
distance.times do |i|klaxonner
endend
end
Définition d’une classe
Définition d’une méthode
Appel de méthode avec deux paramètres
Appel à un itérateur
5
Et la syntaxe ?class Voiture < Vehicule
def avancer(distance)deplacer(:avancer, distance)
distance.times do |i|klaxonner
endend
end
Définition d’une classe
Définition d’une méthode
Appel de méthode avec deux paramètres
Appel à un itérateur
5
Et Rails ?
6
Et Rails ?
• Vue d’ensemble
6
Et Rails ?
• Vue d’ensemble• Le modèle MVC
6
Et Rails ?
• Vue d’ensemble• Le modèle MVC
• Le Modèle : ActiveRecord
6
Et Rails ?
• Vue d’ensemble• Le modèle MVC
• Le Modèle : ActiveRecord• La Vue : ActionView
6
Et Rails ?
• Vue d’ensemble• Le modèle MVC
• Le Modèle : ActiveRecord• La Vue : ActionView• Le Contrôleur : ActionController
6
Et Rails ?
• Vue d’ensemble• Le modèle MVC
• Le Modèle : ActiveRecord• La Vue : ActionView• Le Contrôleur : ActionController
• Développer avec Rails
6
Pourquoi Rails ?
7
Pourquoi Rails ?
• Pour prendre le meilleur de ce qui existe à l’heure actuelle !
7
Pourquoi Rails ?
• Pour prendre le meilleur de ce qui existe à l’heure actuelle !
• Interactivité, simplicité, souplesse
7
Pourquoi Rails ?
• Pour prendre le meilleur de ce qui existe à l’heure actuelle !
• Interactivité, simplicité, souplesse• Structuration, infrastructure puissante,
évolutivité
7
Pourquoi Rails ?
• Pour prendre le meilleur de ce qui existe à l’heure actuelle !
• Interactivité, simplicité, souplesse• Structuration, infrastructure puissante,
évolutivité• À mi-chemin des mondes PHP / J2EE
7
Un exemple
8
Un exemple
8
Un exemple
8
Un exemple
8
Un exemple
class GarageController < ApplicationController
def liste@voitures = Voiture.find(:all)
endend
8
Un exemple
class GarageController < ApplicationController
def liste@voitures = Voiture.find(:all)
endend
8
Un exemple
class Voiture < ActiveRecord::Baseend
class GarageController < ApplicationController
def liste@voitures = Voiture.find(:all)
endend
8
Un exemple
class Voiture < ActiveRecord::Baseend
class GarageController < ApplicationController
def liste@voitures = Voiture.find(:all)
endend
8
Un exemple
class Voiture < ActiveRecord::Baseend
id marque modele
1 Honda Civic
2 Nissan Micra
class GarageController < ApplicationController
def liste@voitures = Voiture.find(:all)
endend
8
Un exemple
class Voiture < ActiveRecord::Baseend
id marque modele
1 Honda Civic
2 Nissan Micra
class GarageController < ApplicationController
def liste@voitures = Voiture.find(:all)
endend
8
Un exemple
class Voiture < ActiveRecord::Baseend
id marque modele
1 Honda Civic
2 Nissan Micra
class GarageController < ApplicationController
def liste@voitures = Voiture.find(:all)
endend
<html><body><h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
</body></html>
8
Un exemple
class Voiture < ActiveRecord::Baseend
id marque modele
1 Honda Civic
2 Nissan Micra
class GarageController < ApplicationController
def liste@voitures = Voiture.find(:all)
endend
<html><body><h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
</body></html>
8
Un exemple
class Voiture < ActiveRecord::Baseend
id marque modele
1 Honda Civic
2 Nissan Micra
class GarageController < ApplicationController
def liste@voitures = Voiture.find(:all)
endend
<html><body><h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
</body></html>
Liste des voitures
Honda - CivicNissan - Micra
8
Définition d’un modèleActiveRecord
voituresLes tables correspondent
à des classes Ruby
Chaque colonne correspond à un attribut
de la classe
Chaque ligne représente un objet Ruby
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 données.
9
Définition d’un modèleActiveRecord
id marque modele
1 Honda Civic
2 Nissan Micra
voituresLes tables correspondent
à des classes Ruby
Chaque colonne correspond à un attribut
de la classe
Chaque ligne représente un objet Ruby
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 données.
9
Gestion de l’information
10
Gestion de l’information
• Rails découvre la structure de la base de données
10
Gestion de l’information
• Rails découvre la structure de la base de données
• Le développeur respecte quelques conventions
10
Gestion de l’information
• Rails découvre la structure de la base de données
• Le développeur respecte quelques conventions
• L’objectif est d’éviter la répétition et de simplifier la maintenance
10
Gestion de l’information
10
Gestion de l’informationv = Voiture.newv.marque = “Renault”v.modele = “Clio”v.save
10
Gestion de l’informationv = Voiture.newv.marque = “Renault”v.modele = “Clio”v.save
10
Gestion de l’informationv = Voiture.newv.marque = “Renault”v.modele = “Clio”v.save
INSERT INTO voitures ("marque", "modele") VALUES('Renault', 'Clio')
10
Gestion de l’informationv = Voiture.newv.marque = “Renault”v.modele = “Clio”v.save
v = Voiture.find(:first)puts v.marque
v.destroy
INSERT INTO voitures ("marque", "modele") VALUES('Renault', 'Clio')
10
Gestion de l’informationv = Voiture.newv.marque = “Renault”v.modele = “Clio”v.save
v = Voiture.find(:first)puts v.marque
v.destroy
INSERT INTO voitures ("marque", "modele") VALUES('Renault', 'Clio')
10
Gestion de l’informationv = Voiture.newv.marque = “Renault”v.modele = “Clio”v.save
v = Voiture.find(:first)puts v.marque
v.destroy
INSERT INTO voitures ("marque", "modele") VALUES('Renault', 'Clio')
SELECT * FROM voitures LIMIT 1
DELETE FROM voitures WHERE id = 1
10
Gestion de l’informationv = Voiture.newv.marque = “Renault”v.modele = “Clio”v.save
v = Voiture.find(:first)puts v.marque
v.destroy
INSERT INTO voitures ("marque", "modele") VALUES('Renault', 'Clio')
SELECT * FROM voitures LIMIT 1
DELETE FROM voitures WHERE id = 1
10
Et les associations ?
11
Et les associations ?class Voiture < ActiveRecord::Base
belongs_to :personneend
11
Et les associations ?class Voiture < ActiveRecord::Base
belongs_to :personneend
class Personne < ActiveRecord::Basehas_many :voitures
end
11
Et les associations ?class Voiture < ActiveRecord::Base
belongs_to :personneend
class Personne < ActiveRecord::Basehas_many :voitures
end
id marque modele personne_id
1 Honda Civic 2
2 Nissan Micra 1
11
Et les associations ?class Voiture < ActiveRecord::Base
belongs_to :personneend
class Personne < ActiveRecord::Basehas_many :voitures
end
id marque modele personne_id
1 Honda Civic 2
2 Nissan Micra 1
id nom prenom
1 Dupont Luc
2 Cavigneaux Nicolas
11
Et les associations ?class Voiture < ActiveRecord::Base
belongs_to :personneend
class Personne < ActiveRecord::Basehas_many :voitures
end
id marque modele personne_id
1 Honda Civic 2
2 Nissan Micra 1
id nom prenom
1 Dupont Luc
2 Cavigneaux Nicolas
11
Et les associations ?class Voiture < ActiveRecord::Base
belongs_to :personneend
class Personne < ActiveRecord::Basehas_many :voitures
end
id marque modele personne_id
1 Honda Civic 2
2 Nissan Micra 1
id nom prenom
1 Dupont Luc
2 Cavigneaux Nicolas
Conventions !
11
UtilisationRails SQL
12
Utilisation
p = Personne.find_by_prenom(“Nicolas”)
p.voitures
Rails SQL
12
Utilisation
p = Personne.find_by_prenom(“Nicolas”)
p.voitures
SELECT * FROM personnes WHERE (personnes."prenom" = 'Nicolas')
SELECT * FROM voitures WHERE (voitures.personne_id = 2)
Rails SQL
12
Utilisation
p = Personne.find_by_prenom(“Nicolas”)
p.voitures
p = Personne.find_by_prenom(“Nicolas”, :include => :voitures)
SELECT * FROM personnes WHERE (personnes."prenom" = 'Nicolas')
SELECT * FROM voitures WHERE (voitures.personne_id = 2)
Rails SQL
12
Utilisation
p = Personne.find_by_prenom(“Nicolas”)
p.voitures
p = Personne.find_by_prenom(“Nicolas”, :include => :voitures)
SELECT * FROM personnes WHERE (personnes."prenom" = 'Nicolas')
SELECT * FROM voitures WHERE (voitures.personne_id = 2)
SELECT personnes.id, personnes.nom, personnes.prenom, voitures.id, voitures.marque, voitures.modele, voitures.personne_id FROM personnes LEFT OUTER JOIN voitures ON voitures.personne_id = personnes.id WHERE (personne.prenom = 'Nicolas')
Rails SQL
12
Mais j’ai des contraintes !
13
Mais j’ai des contraintes !
• ma base existe déjà• mes tables sont préfixées• mes index sont spécifiques• …
13
Mais j’ai des contraintes !
• ma base existe déjà• mes tables sont préfixées• mes index sont spécifiques• …
Convention ne veut pas dire obligation !
Vous pouvez préciser un comportement spécifique table par table et continuer à construire vos requêtes à la main.
13
Les contrôleursActionController
14
Les contrôleursActionController
http://localhost/garage/voir/2
14
Les contrôleursActionController
http://localhost/garage/voir/2
class GarageController < ApplicationControllerdef voir
@voiture = Voiture.find(params[:id])end
end
14
Les contrôleursActionController
http://localhost/garage/voir/2
class GarageController < ApplicationControllerdef voir
@voiture = Voiture.find(params[:id])end
end
Finalement , la vue adéquate sera rendue
14
Que mettre dans le contrôleur ?
15
Que mettre dans le contrôleur ?
• Logique de l’application
15
Que mettre dans le contrôleur ?
• Logique de l’application• préparer les données à afficher
15
Que mettre dans le contrôleur ?
• Logique de l’application• préparer les données à afficher• récupérer les informations d’un formulaire
15
Que mettre dans le contrôleur ?
• Logique de l’application• préparer les données à afficher• récupérer les informations d’un formulaire• faire des vérifications (identification, …)
15
Que mettre dans le contrôleur ?
• Logique de l’application• préparer les données à afficher• récupérer les informations d’un formulaire• faire des vérifications (identification, …)• gérer les redirections
15
Que mettre dans le contrôleur ?
• Logique de l’application• préparer les données à afficher• récupérer les informations d’un formulaire• faire des vérifications (identification, …)• gérer les redirections• récupérer des données externes
15
Les outils disponibles
16
Les outils disponibles• Les filtres
16
Les outils disponibles• Les filtres
• before_filter
16
Les outils disponibles• Les filtres
• before_filter• after_filter
16
Les outils disponibles• Les filtres
• before_filter• after_filter• around_filter
16
Les outils disponibles• Les filtres
• before_filter• after_filter• around_filter
• Le cache
16
Les outils disponibles• Les filtres
• before_filter• after_filter• around_filter
• Le cache• cache de page
16
Les outils disponibles• Les filtres
• before_filter• after_filter• around_filter
• Le cache• cache de page• cache d’action
16
Les outils disponibles• Les filtres
• before_filter• after_filter• around_filter
• Le cache• cache de page• cache d’action• cache de fragment
16
Les outils disponibles• Les filtres
• before_filter• after_filter• around_filter
• Le cache• cache de page• cache d’action• cache de fragment
• Cookies et Sessions
16
Un exempleclass GarageController < ApplicationController
before_filter :logged_in?, :only => :nouveauafter_filter :compresscaches_action :liste
def nouveauif request.get?
@voiture = Voiture.newelse
@voiture = Voiture.create(params[:voiture])redirect_to :action => :liste
endend
def liste@voitures = Voiture.find(:all)
endend
17
Les vuesActionView
18
Les vuesActionView
• Gabarits HTML avec un peu de code Ruby
18
Les vuesActionView
• Gabarits HTML avec un peu de code Ruby• Accès aux variables d’instances générées par
le contrôleur
18
Les vuesActionView
• Gabarits HTML avec un peu de code Ruby• Accès aux variables d’instances générées par
le contrôleur• De nombreux “helpers” pour simplifier
l’écriture des balises, formulaires, appels AJAX, …
18
Un exemple<html><body>
<h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
<%= link_to(‘Nouvelle voiture’, :action => :nouveau) %></body></html>
19
Un exemple<html><body>
<h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
<%= link_to(‘Nouvelle voiture’, :action => :nouveau) %></body></html>
• link_to
19
Un exemple<html><body>
<h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
<%= link_to(‘Nouvelle voiture’, :action => :nouveau) %></body></html>
• link_to• link_to_remote
19
Un exemple<html><body>
<h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
<%= link_to(‘Nouvelle voiture’, :action => :nouveau) %></body></html>
• link_to• link_to_remote• form_tag
19
Un exemple<html><body>
<h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
<%= link_to(‘Nouvelle voiture’, :action => :nouveau) %></body></html>
• link_to• link_to_remote• form_tag• text_field
19
Un exemple<html><body>
<h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
<%= link_to(‘Nouvelle voiture’, :action => :nouveau) %></body></html>
• link_to• link_to_remote• form_tag• text_field• date_select
19
Un exemple<html><body>
<h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
<%= link_to(‘Nouvelle voiture’, :action => :nouveau) %></body></html>
• link_to• link_to_remote• form_tag• text_field• date_select• …
19
Un exemple<html><body>
<h1>Liste des voitures</h1><% @voitures.each do |v| %>
<%= v.marque %> - <%= v.modele %><br/><% end %>
<%= link_to(‘Nouvelle voiture’, :action => :nouveau) %></body></html>
• link_to• link_to_remote• form_tag• text_field• date_select• …
Quelques helpers:
19
Développer avec RoR
20
Développer avec RoR
• Structuration de l’application
20
Développer avec RoR
• Structuration de l’application• dans le code
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
• Encouragement aux bonnes pratiques
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
• Encouragement aux bonnes pratiques• tests unitaires
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
• Encouragement aux bonnes pratiques• tests unitaires• conventions de nommage
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
• Encouragement aux bonnes pratiques• tests unitaires• conventions de nommage• migration des schémas
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
• Encouragement aux bonnes pratiques• tests unitaires• conventions de nommage• migration des schémas
• Facilite le développement
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
• Encouragement aux bonnes pratiques• tests unitaires• conventions de nommage• migration des schémas
• Facilite le développement• rapide
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
• Encouragement aux bonnes pratiques• tests unitaires• conventions de nommage• migration des schémas
• Facilite le développement• rapide• interactif
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
• Encouragement aux bonnes pratiques• tests unitaires• conventions de nommage• migration des schémas
• Facilite le développement• rapide• interactif• échaffaudage
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
• Encouragement aux bonnes pratiques• tests unitaires• conventions de nommage• migration des schémas
• Facilite le développement• rapide• interactif• échaffaudage• générateur de code
20
Développer avec RoR
• Structuration de l’application• dans le code• dans l’arborescence du projet
• Encouragement aux bonnes pratiques• tests unitaires• conventions de nommage• migration des schémas
• Facilite le développement• rapide• interactif• échaffaudage• générateur de code
Les petits plus :
20
Références
21
Références• Livres :
21
Références• Livres :
• Programming Ruby
21
Références• Livres :
• Programming Ruby• The Ruby Way
21
Références• Livres :
• Programming Ruby• The Ruby Way• Ruby For Rails
21
Références• Livres :
• Programming Ruby• The Ruby Way• Ruby For Rails• Rails Recipes
21
Références• Livres :
• Programming Ruby• The Ruby Way• Ruby For Rails• Rails Recipes• Agile Web Development with Rails
21
Références• Livres :
• Programming Ruby• The Ruby Way• Ruby For Rails• Rails Recipes• Agile Web Development with Rails
• Web :
21
Références• Livres :
• Programming Ruby• The Ruby Way• Ruby For Rails• Rails Recipes• Agile Web Development with Rails
• Web :• http://www.ruby-lang.org
21
Références• Livres :
• Programming Ruby• The Ruby Way• Ruby For Rails• Rails Recipes• Agile Web Development with Rails
• Web :• http://www.ruby-lang.org• http://www.rubyonrails.org
21
Références• Livres :
• Programming Ruby• The Ruby Way• Ruby For Rails• Rails Recipes• Agile Web Development with Rails
• Web :• http://www.ruby-lang.org• http://www.rubyonrails.org• http://www.rubyforge.org
21
Références• Livres :
• Programming Ruby• The Ruby Way• Ruby For Rails• Rails Recipes• Agile Web Development with Rails
• Web :• http://www.ruby-lang.org• http://www.rubyonrails.org• http://www.rubyforge.org• http://www.railsfrance.org
21
Références• Livres :
• Programming Ruby• The Ruby Way• Ruby For Rails• Rails Recipes• Agile Web Development with Rails
• Web :• http://www.ruby-lang.org• http://www.rubyonrails.org• http://www.rubyforge.org• http://www.railsfrance.org• http://blog.webpulser.com
21
Références• Livres :
• Programming Ruby• The Ruby Way• Ruby For Rails• Rails Recipes• Agile Web Development with Rails
• Web :• http://www.ruby-lang.org• http://www.rubyonrails.org• http://www.rubyforge.org• http://www.railsfrance.org• http://blog.webpulser.com• http://www.bounga.org
21
Des questions ?
22
Réutilisation du contenuLes contenus originaux de cette présentation sont diffusés sous licence Creative Commons avec les options :
• Paternité (obligation de mentionner l'auteur) • Pas d'utilisation commerciale (sans accord explicite) • Pas de modifications (contenu d'opinion)
La licence complète est disponible à l'adresse :http://creativecommons.org/licenses/by-nc-nd/2.0/fr/
Toute autre utilisation nécessite un accord explicite et écrit de la part de l'auteur.
Contact : nicolas.cavigneaux@webpulser.com
23
top related