Présentation de Ruby on Rails -...

Preview:

Citation preview

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

Recommended