Tunisia on Rails 2010
-
Upload
richard-piacentini -
Category
Technology
-
view
691 -
download
0
description
Transcript of Tunisia on Rails 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Richard Piacentini
Tunisia on Rails -15 Mai 2010
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos GroupThursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Langage de Programmation
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Langage de Programmation Framework Web
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Langage de ProgrammationFramework Web
Thursday, May 20, 2010
Framework Web ?
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Ensemble de composants
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Socle commun
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Structure identique
Thursday, May 20, 2010
Pourquoi utiliser un framework ?
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Pour ne pas réinventer la roue
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Pour imposer des normes...
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
... Et des bonnes pratiques !
Thursday, May 20, 2010
Quels sont les gains ?
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Productivité
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Réutilisation
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Économies d’échelle
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Focalisation sur la valeur ajoutée
Thursday, May 20, 2010
Thursday, May 20, 2010
Les principes
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
DRY
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
DRY“Don’t repeat yourself !”“Don’t repeat yourself !”
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
DRY“Don’t repeat yourself !”
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
“Convention over configuration”
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
“Opinionated framework”
Thursday, May 20, 2010
Les avantages
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Ruby full-stack
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
MVC
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
MVCModel / View / Controller
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Tests intégrés !
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos GroupThursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Écrivez des tests !
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos GroupThursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Écrivez des tests !
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos GroupThursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Écrivez des tests ! Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !
Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests ! Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Écrivez des tests ! Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !
Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests ! Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !
Écrivez des tests !Écrivez des tests !
Écrivez des tests !
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos GroupThursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Écrivez des tests !
Thursday, May 20, 2010
Les composants
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord
ActionView
ActionController
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord
ActionView
ActionController
Model
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord
ActionView
ActionController
Model
View
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord
ActionView
ActionController
Model
View
Controller
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord
ActionView
ActionController
Model
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord
ActionView
ActionController
Model
ViewController
ActionPack}Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Exemple
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
http://paris.onrails.info/conferenciers
Exemple
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Routage
http://paris.onrails.info/conferenciersRails
Exemple
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Routage
Contrôleur “conferenciers”
http://paris.onrails.info/conferenciers
Le système de routage trouve le contrôleur “conférenciers
Rails
Exemple
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Routage
Contrôleur “conferenciers”
ModèleActiveRecord
http://paris.onrails.info/conferenciers
Le système de routage trouve le contrôleur “conférenciersLe contrôleur interagit avec le modèle
Rails
Exemple
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Routage
Contrôleur “conferenciers”
ModèleActiveRecord
Base de données
http://paris.onrails.info/conferenciers
Le système de routage trouve le contrôleur “conférenciersLe contrôleur interagit avec le modèle
Rails
Exemple
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Routage
Contrôleur “conferenciers”
ModèleActiveRecord
Affichage de la vue
Base de données
http://paris.onrails.info/conferenciers
Le système de routage trouve le contrôleur “conférenciersLe contrôleur interagit avec le modèle
Le contrôleur invoque la vue
Rails
Exemple
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Routage
Contrôleur “conferenciers”
ModèleActiveRecord
Affichage de la vue
Base de données
http://paris.onrails.info/conferenciers
Le système de routage trouve le contrôleur “conférenciersLe contrôleur interagit avec le modèle
Le contrôleur invoque la vue
La vue assure le rendu du prochain écran du navigateur
Rails
Exemple
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Routage
Contrôleur “conferenciers”
ModèleActiveRecord
Affichage de la vue
Base de données
http://paris.onrails.info/conferenciers
Le système de routage trouve le contrôleur “conférenciersLe contrôleur interagit avec le modèle
Le contrôleur invoque la vue
La vue assure le rendu du prochain écran du navigateur
Rails
Exemple
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Connexion au SGBD
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Connexion au SGBD
• Mapping Objet-Relationnel
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Connexion au SGBD
• Mapping Objet-Relationnel
• Gestion des relations entre les tables
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Connexion au SGBD
• Mapping Objet-Relationnel
• Gestion des relations entre les tables
• Plus de SQL à écrire
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user = User.new
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user = User.new SHOW FIELDS FROM `users`
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user = User.new SHOW FIELDS FROM `users`user.name = "Richard Piacentini"user.company = "Nuxos"
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user = User.new SHOW FIELDS FROM `users`user.name = "Richard Piacentini"user.company = "Nuxos"user.save
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user = User.new SHOW FIELDS FROM `users`user.name = "Richard Piacentini"user.company = "Nuxos"user.save INSERT INTO `users` (`name`, `company`)
VALUES ('Richard Piacentini', 'Nuxos')
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user = User.new SHOW FIELDS FROM `users`user.name = "Richard Piacentini"user.company = "Nuxos"user.save INSERT INTO `users` (`name`, `company`)
VALUES ('Richard Piacentini', 'Nuxos')
user = User.find_by_company("Nuxos")
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user = User.new SHOW FIELDS FROM `users`user.name = "Richard Piacentini"user.company = "Nuxos"user.save INSERT INTO `users` (`name`, `company`)
VALUES ('Richard Piacentini', 'Nuxos')
user = User.find_by_company("Nuxos") SELECT * FROM `users`WHERE company = "Nuxos" LIMIT 1
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user = User.new SHOW FIELDS FROM `users`user.name = "Richard Piacentini"user.company = "Nuxos"user.save INSERT INTO `users` (`name`, `company`)
VALUES ('Richard Piacentini', 'Nuxos')
user = User.find_by_company("Nuxos") SELECT * FROM `users`WHERE company = "Nuxos" LIMIT 1
user.destroy
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user = User.new SHOW FIELDS FROM `users`user.name = "Richard Piacentini"user.company = "Nuxos"user.save INSERT INTO `users` (`name`, `company`)
VALUES ('Richard Piacentini', 'Nuxos')
user = User.find_by_company("Nuxos") SELECT * FROM `users`WHERE company = "Nuxos" LIMIT 1
user.destroy DELETE FROM `users` WHERE id = 2
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Classe <----> Table de la BD
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Classe <----> Table de la BD
• Objet <----> Enregistrement
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Classe <----> Table de la BD
• Objet <----> Enregistrement
• Attribut <----> Champ de la table
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
users
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Classe <--> Table
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
id name company
1 Paul Durand Orange
2 Richard Piacentini Nuxos
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Classe <--> Table
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
id name company
1 Paul Durand Orange
2 Richard Piacentini Nuxos
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Classe <--> Table
user = User.find_by_company("Nuxos")
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
id name company
1 Paul Durand Orange
2 Richard Piacentini Nuxos
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Classe <--> Table
user = User.find_by_company("Nuxos")
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
id name company
1 Paul Durand Orange
2 Richard Piacentini Nuxos
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Classe <--> Table
user = User.find_by_company("Nuxos")
Objet <--> Enregistrement
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
id name company
1 Paul Durand Orange
2 Richard Piacentini Nuxos
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Classe <--> Table
user.name
user = User.find_by_company("Nuxos")
Objet <--> Enregistrement
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
id name company
1 Paul Durand Orange
2 Richard Piacentini Nuxos
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Classe <--> Table
user.name
user = User.find_by_company("Nuxos")
Objet <--> Enregistrement
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
id name company
1 Paul Durand Orange
2 Richard Piacentini Nuxos
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Classe <--> Table
user.name user.company
user = User.find_by_company("Nuxos")
Objet <--> Enregistrement
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
id name company
1 Paul Durand Orange
2 Richard Piacentini Nuxos
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Classe <--> Table
user.name user.company
user = User.find_by_company("Nuxos")
Objet <--> Enregistrement
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
id name company
1 Paul Durand Orange
2 Richard Piacentini Nuxos
users
# fichier modèle app/models/user.rbclass User < ActiveRecord::Baseend
Classe <--> Table
user.name user.company
user = User.find_by_company("Nuxos")
Objet <--> Enregistrement
Attribut <--> Champ
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Nom de la clef primaire : id
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Nom de la clef primaire : id
• Nom des table de la BD en minuscules et au pluriel
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Nom de la clef primaire : id
• Nom des table de la BD en minuscules et au pluriel
• Nom des classes Ruby au singulier, casse mixte
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
• Nom de la clef primaire : id
• Nom des table de la BD en minuscules et au pluriel
• Nom des classes Ruby au singulier, casse mixte
• Fichiers modèles au singulier, en minuscules
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user_invoices
id
user_id
amount
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user_invoices
id
user_id
amount
• Table : user_invoices
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user_invoices
id
user_id
amount
• Table : user_invoices
• Fichier modèle : app/models/user_invoice.rb
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user_invoices
id
user_id
amount
• Table : user_invoices
• Fichier modèle : app/models/user_invoice.rb
• Classe Ruby : UserInvoice
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRecord Model
user_invoices
id
user_id
amount
• Table : user_invoices
• Fichier modèle : app/models/user_invoice.rb
• Classe Ruby : UserInvoice
class UserInvoice < ActiveRecord::Baseend
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
•1 méthode publique = 1 action
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
•1 méthode publique = 1 action
• Gestion du routage
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
•1 méthode publique = 1 action
• Gestion du routage
• Gestion des caches (page, action, fragment)
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
•1 action…
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
•1 action… • …Plusieurs formats de réponse
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
•1 action… • …Plusieurs formats de réponse # GET /users # GET /users.xml def index @users = Users.all
respond_to do |format| format.html # index.html.erb format.xml { render :xml => @users } end end
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
•GET /users
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
•GET /users
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
•GET /users.xml
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionController Controller
•GET /users.xml
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
• Séparation entre format et rendu
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
• Séparation entre format et rendu• HTML, Javascript, atom, iPhone
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
• Séparation entre format et rendu• HTML, Javascript, atom, iPhone• ERB, Builder, RJS
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
• Séparation entre format et rendu• HTML, Javascript, atom, iPhone• ERB, Builder, RJS• Gestion des layouts (gabarits)
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
• Séparation entre format et rendu• HTML, Javascript, atom, iPhone• ERB, Builder, RJS• Gestion des layouts (gabarits)• Fichiers partiels
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
• Séparation entre format et rendu• HTML, Javascript, atom, iPhone• ERB, Builder, RJS• Gestion des layouts (gabarits)• Fichiers partiels• Nombreux Helpers
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
•ERB : Embedded Ruby
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
•ERB : Embedded Ruby
• Fichier avec extension .html.erb
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
•ERB : Embedded Ruby
• Fichier avec extension .html.erb
• Accès aux variables d’instance du contrôleur
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
# code Ruby non affiché dans la page <% %><% @users.each |user| do %> # … ici code HTML ou Ruby<% end %>
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
# code Ruby non affiché dans la page <% %><% @users.each |user| do %> # … ici code HTML ou Ruby<% end %>
# code Ruby *affiché* dans la page <%= %><%= link_to 'Edit', edit_user_path(user) %>
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActionView View
# code Ruby non affiché dans la page <% %><% @users.each |user| do %> # … ici code HTML ou Ruby<% end %>
# code Ruby *affiché* dans la page <%= %><%= link_to 'Edit', edit_user_path(user) %>
<a href="/users/1/edit">Edit</a>
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Rails 3
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Performance
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Modularité
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Sécurisé par défaut
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Prêt pour HTML5
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
API publique
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Nouveaux Validateurs
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Nouveaux Validateurs# Rails 2class User < ActiveRecord::Base validates_presence_of :login, :email validates_length_of :login, :in => 3..20 validates_format_of :login, :with => /^[A-Z]\w+/i validates_uniqueness_of :email validates_length_of :email, :in => 5..100 validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/iend
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Nouveaux Validateurs
# Rails 3class User < ActiveRecord::Base validates :login, :presence => true, :length => {:minimum => 3, :maximum => 20}, :format => {:with => /^[A-Z]\w+/i} validates :email, :presence => true, :length => {:minimum => 5, :maximum => 50}, :uniqueness => true, :format => {:with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i} end
# Rails 2class User < ActiveRecord::Base validates_presence_of :login, :email validates_length_of :login, :in => 3..20 validates_format_of :login, :with => /^[A-Z]\w+/i validates_uniqueness_of :email validates_length_of :email, :in => 5..100 validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/iend
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Nouveaux Validateurs
# Rails 3class User < ActiveRecord::Base validates :login, :presence => true, :length => {:minimum => 3, :maximum => 20}, :format => {:with => /^[A-Z]\w+/i} validates :email, :presence => true, :length => {:minimum => 5, :maximum => 50}, :uniqueness => true, :format => {:with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i} end
# Rails 2class User < ActiveRecord::Base validates_presence_of :login, :email validates_length_of :login, :in => 3..20 validates_format_of :login, :with => /^[A-Z]\w+/i validates_uniqueness_of :email validates_length_of :email, :in => 5..100 validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/iend
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Nouveaux Validateurs# Rails 3class User < ActiveRecord::Base validates :login, :presence => true, :length => {:minimum => 3, :maximum => 20}, :format => {:with => /^[A-Z]\w+/i} validates :email, :presence => true, :length => {:minimum => 5, :maximum => 50}, :uniqueness => true, :format => {:with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i}end
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Nouveaux Validateurs
:acceptance => Boolean:confirmation => Boolean:exclusion => { :in => Enumerable }:inclusion => { :in => Enumerable }:format => { :with => Regexp }:length => { :minimum => Fixnum, :maximum => Fixnum }:numericality => Boolean:presence => Boolean:uniqueness => Boolean
# Rails 3class User < ActiveRecord::Base validates :login, :presence => true, :length => {:minimum => 3, :maximum => 20}, :format => {:with => /^[A-Z]\w+/i} validates :email, :presence => true, :length => {:minimum => 5, :maximum => 50}, :uniqueness => true, :format => {:with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i}end
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveModel
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveModel
class Person attr_accessor :name
end
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveModel
class Person attr_accessor :name
end
include ActiveModel::Validations
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveModel
class Person attr_accessor :name
endvalidates :name, :presence => trueinclude ActiveModel::Validations
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveModel
class Person attr_accessor :name
endvalidates :name, :presence => true
p = Person.new
include ActiveModel::Validations
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveModel
class Person attr_accessor :name
endvalidates :name, :presence => true
p = Person.new
include ActiveModel::Validations
p.valid? # false
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveModel
class Person attr_accessor :name
endvalidates :name, :presence => true
p = Person.new
include ActiveModel::Validations
p.valid? # falsep.name = "Richard Piacentini"
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveModel
class Person attr_accessor :name
endvalidates :name, :presence => true
p = Person.new
include ActiveModel::Validations
p.valid? # falsep.name = "Richard Piacentini"p.valid? # true
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
• where• having• select• group• order• limit
• offset• joins• includes• lock• readonly• from
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
# Rails 2@users = User.find(:all, :conditions => { :active => true }
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
# Rails 2@users = User.find(:all, :conditions => { :active => true }
La requête est exécutée immédiatement dans la base de données
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
# Rails 2@users = User.find(:all, :conditions => { :active => true }
La requête est exécutée immédiatement dans la base de données
Array
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
# Rails 2@users = User.find(:all, :conditions => { :active => true }
# Rails 3@users = User.where(:active => true)
La requête est exécutée immédiatement dans la base de données
Array
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
# Rails 2@users = User.find(:all, :conditions => { :active => true }
# Rails 3@users = User.where(:active => true)
La requête est exécutée immédiatement dans la base de données
Array
Pas d’appel à la base de données
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
# Rails 2@users = User.find(:all, :conditions => { :active => true }
# Rails 3@users = User.where(:active => true)
La requête est exécutée immédiatement dans la base de données
Array
Pas d’appel à la base de donnéesActiveRecord::Relation
(lazy loading)
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
@users = User.order(:created_at).where(company: "Nuxos", active: true)# Rails 3
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
@users = User.order(:created_at).where(company: "Nuxos", active: true)
@users.class # => ActiveRecord::Relation
# Rails 3
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
@users = User.order(:created_at).where(company: "Nuxos", active: true)
@users.class # => ActiveRecord::Relation
@users.to_sql# => ‘SELECT "users".* FROM "users" WHERE ("users"."company" = 'Nuxos') AND ("users"."active" = 't') ORDER BY created_at’
# Rails 3
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
ActiveRelation
@users = User.order(:created_at).where(company: "Nuxos", active: true)# Rails 3
@users = User.all(:conditions => ["company = ? AND active = ?", "Nuxos", true], :order => :created_at)
# Rails 2
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scopes ++
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scopes ++
# Rails 2class User < ActiveRecord::Base named_scope :admin, :conditions => ["is_admin = ?", true] named_scope :activated, lambda { { :conditions => ["activated_at ≤ ?", Time.now] } }end
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scopes ++
# Rails 2class User < ActiveRecord::Base named_scope :admin, :conditions => ["is_admin = ?", true] named_scope :activated, lambda { { :conditions => ["activated_at ≤ ?", Time.now] } }end
# Rails 3class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ≤ ?", Time.now) }end
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scopes ++
# Rails 2class User < ActiveRecord::Base named_scope :admin, :conditions => ["is_admin = ?", true] named_scope :activated, lambda { { :conditions => ["activated_at ≤ ?", Time.now] } }end
# Rails 3class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ≤ ?", Time.now) }end
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scopes ++
# Rails 2class User < ActiveRecord::Base named_scope :admin, :conditions => ["is_admin = ?", true] named_scope :activated, lambda { { :conditions => ["activated_at ≤ ?", Time.now] } }end
# Rails 3class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ≤ ?", Time.now) }end
@admins = User.admin.activated # => retourne tous les admin activés
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scope ++
# Rails3class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ≤ ?", Time.now) }
end
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scope ++
# Rails3class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ≤ ?", Time.now) }
end scope :recent_admins, admin.activated.order("created_at DESC").limit(5)
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scope ++
# Rails3class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ≤ ?", Time.now) }
end scope :recent_admins, admin.activated.order("created_at DESC").limit(5)
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scope ++
# Rails3class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ≤ ?", Time.now) }
end scope :recent_admins, admin.activated.order("created_at DESC").limit(5)
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scope ++
# Rails3class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ≤ ?", Time.now) }
end scope :recent_admins, admin.activated.order("created_at DESC").limit(5)
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Named Scope ++
# Rails3class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ≤ ?", Time.now) }
end scope :recent_admins, admin.activated.order("created_at DESC").limit(5)
@recent_admins = User.recent_admins
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Les scripts
Rails 2
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Les scriptsRails 3
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Les scripts
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Les scripts
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Les scripts
alias r=‘rails’
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Et aussi...
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
• Nouvelle API de routage
Et aussi...
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
• Nouvelle API de routage
• Nouvelle architecture d’ActionController
Et aussi...
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
• Nouvelle API de routage
• Nouvelle architecture d’ActionController
• ActionMailer 3
Et aussi...
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
• Nouvelle API de routage
• Nouvelle architecture d’ActionController
• ActionMailer 3
• Bundler
Et aussi...
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
• Nouvelle API de routage
• Nouvelle architecture d’ActionController
• ActionMailer 3
• Bundler
• ...
Et aussi...
Thursday, May 20, 2010
Bientôt…
Thursday, May 20, 2010
Pourquoi Rails ?
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Efficace
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Tests intégrés !
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Bonnes pratiques
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Tests intégrés !
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Nombreux plugins
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Tests intégrés !
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Ruby
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Et surtout...
Thursday, May 20, 2010
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Statistiques d’utilisation des version de RailsJanvier 2010
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
v2.3.432.6%
v2.3.221%
v2.3.514% v2.2.2
11%v2.3.3
7%4%
3%Others
9%
v2.3.4 v2.3.2v2.3.5 v2.2.2v2.3.3 v2.1.0v2.1.2 Others
Statistiques d’utilisation des version de RailsJanvier 2010
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Statistiques d’utilisation des version de RubyJanvier 2010
v1.8.6 v1.9.1v1.8.7 v1.8.5
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
v1.8.663.5%
v1.9.11%
v1.8.732%
v1.8.53%
Statistiques d’utilisation des version de RubyJanvier 2010
v1.8.6 v1.9.1v1.8.7 v1.8.5
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
v1.8.663.5%
v1.9.11%
v1.8.732%
v1.8.53%
Statistiques d’utilisation des version de RubyJanvier 2010
v1.8.6 v1.9.1v1.8.7 v1.8.5
http://railslab.newrelic.com/2010/01/07/state-of-the-stack-a-ruby-on-rails-benchmarking-report-7-january-2010
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Programming Ruby 1.9 The Ruby WayThe Well
Grounded RubyistRuby on Rails
4th editionDesign patterns en Ruby
Littérature
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
De Ruby ... Á Rails
Programming Ruby 1.9 The Ruby WayThe Well
Grounded RubyistRuby on Rails
4th editionDesign patterns en Ruby
Littérature
Thursday, May 20, 2010
Thursday, May 20, 2010
Merci :-)
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Des questions ?
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
RessourcesRails Guides : http://guides.rubyonrails.org
Railscasts : http://railscasts.com
Scaling Rails : http://railslab.newrelic.com/scaling-rails
Peepcode : http://peepcode.com ($)
Railsfrance : http://www.railsfrance.org
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Crédit images Flicker
http://www.flickr.com/photos/projekta8/2736962559/sizes/l/
http://www.flickr.com/photos/onkel_wart/4038437003/sizes/o/
http://www.flickr.com/photos/tiemposdelruido/4051814934/sizes/l/
http://www.flickr.com/photos/27889738@N07/3289774573/sizes/l/
http://www.flickr.com/photos/mworrell/266180687/sizes/o/in/photostream/
http://www.flickr.com/photos/teddybare/133488169/
http://www.flickr.com/photos/nomadiclass/4395155397/sizes/l/
Thursday, May 20, 2010