Escolar Documentos
Profissional Documentos
Cultura Documentos
Langage de Programmation
Langage de Programmation
Framework Web
Framework Web
Langage de Programmation
Framework Web ?
Ensemble de composants
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Socle commun
Structure identique
Productivit
Rutilisation
conomies dchelle
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Les principes
DRY
DRY
Dont repeat yourself ! Dont repeat yourself !
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
DRY
Dont repeat yourself !
Opinionated framework
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Les avantages
Ruby full-stack
MVC
MVC
Model / View / Controller
Tests intgrs !
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 !
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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 !
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Les composants
Model
Model View
Model
Model
ActionPack
View Controller
Exemple
Exemple
http://paris.onrails.info/conferenciers
Exemple
Rails
Routage
http://paris.onrails.info/conferenciers
Exemple
Rails
Routage
Contrleur conferenciers
Exemple
Rails
Routage
http://paris.onrails.info/conferenciers Le systme de routage trouve le contrleur confrenciers Le contrleur interagit avec le modle
Contrleur conferenciers
Exemple
Rails
Routage
http://paris.onrails.info/conferenciers Le systme de routage trouve le contrleur confrenciers Le contrleur interagit avec le modle
Contrleur conferenciers
Base de donnes
Exemple
Rails
Routage
http://paris.onrails.info/conferenciers Le systme de routage trouve le contrleur confrenciers Le contrleur interagit avec le modle Le contrleur invoque la vue
Contrleur conferenciers
Affichage de la vue
Base de donnes
Exemple
Rails
Routage
http://paris.onrails.info/conferenciers Le systme de routage trouve le contrleur confrenciers Le contrleur interagit avec le modle Le contrleur invoque la vue La vue assure le rendu du prochain cran du navigateur
Contrleur conferenciers
Affichage de la vue
Base de donnes
Exemple
Rails
Routage
http://paris.onrails.info/conferenciers Le systme de routage trouve le contrleur confrenciers Le contrleur interagit avec le modle Le contrleur invoque la vue La vue assure le rendu du prochain cran du navigateur
Contrleur conferenciers
Affichage de la vue
Base de donnes
ActiveRecord
Model
ActiveRecord
Model
Connexion au SGBD
ActiveRecord
Model
ActiveRecord
Model
Connexion au SGBD Mapping Objet-Relationnel Gestion des relations entre les tables
ActiveRecord
Model
Connexion au SGBD Mapping Objet-Relationnel Gestion des relations entre les tables Plus de SQL crire
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord
Model
ActiveRecord
user = User.new
Model
ActiveRecord
user = User.new
Model
SHOW FIELDS FROM `users`
ActiveRecord
user = User.new user.name = "Richard Piacentini" user.company = "Nuxos"
Model
SHOW FIELDS FROM `users`
ActiveRecord
user = User.new user.name = "Richard Piacentini" user.company = "Nuxos" user.save
Model
SHOW FIELDS FROM `users`
ActiveRecord
user = User.new user.name = "Richard Piacentini" user.company = "Nuxos" user.save
Model
SHOW FIELDS FROM `users`
ActiveRecord
user = User.new user.name = "Richard Piacentini" user.company = "Nuxos" user.save
Model
SHOW FIELDS FROM `users`
user = User.find_by_company("Nuxos")
ActiveRecord
user = User.new user.name = "Richard Piacentini" user.company = "Nuxos" user.save
Model
SHOW FIELDS FROM `users`
user = User.find_by_company("Nuxos")
ActiveRecord
user = User.new user.name = "Richard Piacentini" user.company = "Nuxos" user.save
Model
SHOW FIELDS FROM `users`
user = User.find_by_company("Nuxos")
user.destroy
ActiveRecord
user = User.new user.name = "Richard Piacentini" user.company = "Nuxos" user.save
Model
SHOW FIELDS FROM `users`
user = User.find_by_company("Nuxos")
user.destroy
ActiveRecord
Model
ActiveRecord
Model
Classe
<----> Table de la BD
ActiveRecord
Model
Classe Objet
ActiveRecord
Model
ActiveRecord
Model
users
ActiveRecord
Model
users
ActiveRecord
Model
users
ActiveRecord
Model
users
ActiveRecord
Model
users
id
company
Orange
1 2
Nuxos
ActiveRecord
Model
users
id
company
Orange
1 2
Nuxos
user = User.find_by_company("Nuxos")
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord
Model
users
id
company
Orange
1 2
Nuxos
user = User.find_by_company("Nuxos")
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord
Model
users
id
company
Orange
1 2
Nuxos
user = User.find_by_company("Nuxos")
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord
Model
users
id
company
Orange
1 2
Nuxos
user = User.find_by_company("Nuxos")
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord
Model
users
id
company
Orange
1 2
Nuxos
user = User.find_by_company("Nuxos")
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord
Model
user.company
users
id
company
Orange
1 2
Nuxos
user = User.find_by_company("Nuxos")
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord
Model
user.company
users
id
company
Orange
1 2
Nuxos
user = User.find_by_company("Nuxos")
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord
Model
user.company
users
id
company
Orange
1 2
Nuxos
user = User.find_by_company("Nuxos")
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord
Model
ActiveRecord
Model
ActiveRecord
Model
ActiveRecord
Model
ActiveRecord
Model
au pluriel Nom des classes Ruby au singulier, casse mixte Fichiers modles au singulier, en minuscules
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord
user_invoices id user_id amount
Model
ActiveRecord
user_invoices id user_id amount
Model
Table : user_invoices
ActiveRecord
user_invoices id user_id amount
Model
ActiveRecord
user_invoices id user_id amount
Model
ActiveRecord
user_invoices id user_id amount
Model
class UserInvoice < ActiveRecord::Base end
ActionController
Controller
ActionController
Controller
ActionController
Controller
ActionController
Controller
1 mthode publique = 1 action Gestion du routage Gestion des caches (page, action,
fragment)
ActionController
Controller
ActionController
Controller
1 action
ActionController
Controller
ActionController
Controller
ActionController
Controller
GET /users
ActionController
Controller
GET /users
ActionController
Controller
GET /users.xml
ActionController
Controller
GET /users.xml
ActionView
View
ActionView
View
ActionView
View
ActionView
View
Sparation entre format et rendu HTML, Javascript, atom, iPhone ERB, Builder, RJS
ActionView
View
Sparation entre format et rendu HTML, Javascript, atom, iPhone ERB, Builder, RJS Gestion des layouts (gabarits)
ActionView
View
Sparation entre format et rendu HTML, Javascript, atom, iPhone ERB, Builder, RJS Gestion des layouts (gabarits) Fichiers partiels
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView
View
Sparation entre format et rendu HTML, Javascript, atom, iPhone ERB, Builder, RJS Gestion des layouts (gabarits) Fichiers partiels Nombreux Helpers
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView
View
ActionView
View
ActionView
View
ActionView
View
ERB : Embedded Ruby Fichier avec extension .html.erb Accs aux variables dinstance du
contrleur
ActionView
View
<% @users.each |user| do %> # ici code HTML ou Ruby <% end %>
ActionView
View
<% @users.each |user| do %> # ici code HTML ou Ruby <% end %>
# code Ruby *affich* dans la page <%= %> <%= link_to 'Edit', edit_user_path(user) %>
ActionView
View
<% @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>
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Rails 3
Performance
Modularit
API publique
Nouveaux Validateurs
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Nouveaux Validateurs
# Rails 2 class 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,})$/i end
Nouveaux Validateurs
# Rails 2 class 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,})$/i end # Rails 3 class 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
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Nouveaux Validateurs
# Rails 2 class 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,})$/i end # Rails 3 class 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
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Nouveaux Validateurs
# Rails 3 class 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
Nouveaux Validateurs
# Rails 3 class 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
:acceptance => Boolean :confirmation => Boolean :exclusion => { :in => Enumerable } :inclusion => { :in => Enumerable } :format => { :with => Regexp } :length => { :minimum => Fixnum, :maximum => Fixnum } :numericality => Boolean :presence => Boolean :uniqueness => Boolean
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveModel
ActiveModel
class Person attr_accessor :name
end
ActiveModel
class Person attr_accessor :name include ActiveModel::Validations end
ActiveModel
class Person attr_accessor :name include ActiveModel::Validations validates :name, :presence => true end
ActiveModel
class Person attr_accessor :name include ActiveModel::Validations validates :name, :presence => true end p = Person.new
ActiveModel
class Person attr_accessor :name include ActiveModel::Validations validates :name, :presence => true end p = Person.new p.valid? # false
ActiveModel
class Person attr_accessor :name include ActiveModel::Validations validates :name, :presence => true end p = Person.new p.valid? # false
ActiveModel
class Person attr_accessor :name include ActiveModel::Validations validates :name, :presence => true end p = Person.new p.valid? # false
ActiveRelation
ActiveRelation
ActiveRelation
ActiveRelation
# Rails 2 @users = User.find(:all, :conditions => { :active => true }
ActiveRelation
# Rails 2 @users = User.find(:all, :conditions => { :active => true }
ActiveRelation
# Rails 2 @users = User.find(:all, :conditions => { :active => true }
Array
ActiveRelation
# Rails 2 @users = User.find(:all, :conditions => { :active => true }
Array
ActiveRelation
# Rails 2 @users = User.find(:all, :conditions => { :active => true }
Array
ActiveRelation
# Rails 2 @users = User.find(:all, :conditions => { :active => true }
Array
ActiveRelation
# Rails 3 @users = User.order(:created_at).where(company: "Nuxos", active: true)
ActiveRelation
# Rails 3 @users = User.order(:created_at).where(company: "Nuxos", active: true)
ActiveRelation
# Rails 3 @users = User.order(:created_at).where(company: "Nuxos", active: true)
@users.to_sql
# => SELECT "users".* FROM "users" WHERE ("users"."company" = 'Nuxos') AND ("users"."active" = 't') ORDER BY created_at
ActiveRelation
@users = User.order(:created_at).where(company: "Nuxos", active: true)
# Rails 3
Named Scopes ++
Named Scopes ++
# Rails 2
class User < ActiveRecord::Base named_scope :admin, :conditions => ["is_admin = ?", true] named_scope :activated, lambda { { :conditions => ["activated_at ?", Time.now] } } end
Named Scopes ++
# Rails 2
class User < ActiveRecord::Base named_scope :admin, :conditions => ["is_admin = ?", true] named_scope :activated, lambda { { :conditions => ["activated_at ?", Time.now] } } end
# Rails 3
class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ?", Time.now) } end
Named Scopes ++
# Rails 2
class User < ActiveRecord::Base named_scope :admin, :conditions => ["is_admin = ?", true] named_scope :activated, lambda { { :conditions => ["activated_at ?", Time.now] } } end
# Rails 3
class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ?", Time.now) } end
Named Scopes ++
# Rails 2
class User < ActiveRecord::Base named_scope :admin, :conditions => ["is_admin = ?", true] named_scope :activated, lambda { { :conditions => ["activated_at ?", Time.now] } } end
# Rails 3
class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ?", Time.now) } end
Named Scope ++
# Rails3
class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true)
scope :activated, lambda { where("activated_at ?", Time.now) }
end
Named Scope ++
# Rails3
class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true)
scope :activated, lambda { where("activated_at ?", Time.now) }
scope :recent_admins, admin.activated.order("created_at DESC").limit(5) end
Named Scope ++
# Rails3
class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true)
scope :activated, lambda { where("activated_at ?", Time.now) }
scope :recent_admins, admin.activated.order("created_at DESC").limit(5) end
Named Scope ++
# Rails3
class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true)
scope :activated, lambda { where("activated_at ?", Time.now) }
scope :recent_admins, admin.activated.order("created_at DESC").limit(5) end
Named Scope ++
# Rails3
class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true)
scope :activated, lambda { where("activated_at ?", Time.now) }
scope :recent_admins, admin.activated.order("created_at DESC").limit(5) end
Named Scope ++
# Rails3
class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true)
scope :activated, lambda { where("activated_at ?", Time.now) }
scope :recent_admins, admin.activated.order("created_at DESC").limit(5) end
@recent_admins = User.recent_admins
Les scripts
Rails 2
Les scripts
Rails 3
Les scripts
Les scripts
Les scripts
alias r=rails
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Et aussi...
Et aussi...
Nouvelle API de routage
Et aussi...
Nouvelle API de routage Nouvelle architecture dActionController
Et aussi...
Nouvelle API de routage Nouvelle architecture dActionController ActionMailer 3
Et aussi...
Nouvelle API de routage Nouvelle architecture dActionController ActionMailer 3 Bundler
Et aussi...
Nouvelle API de routage Nouvelle architecture dActionController ActionMailer 3 Bundler ...
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Bientt
Pourquoi Rails ?
Efficace
Tests intgrs !
Bonnes pratiques
Tests intgrs !
Nombreux plugins
Tests intgrs !
Ruby
Et surtout...
v2.3.2 21%
v2.3.4 32.6%
v1.9.1 v1.8.5
v1.8.7 32%
v1.9.1 v1.8.5
v1.8.7 32%
http://railslab.newrelic.com/2010/01/07/state-of-the-stack-a-ruby-on-rails-benchmarking-report-7-january-2010
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Littrature
Programming Ruby 1.9
Littrature
Programming Ruby 1.9
De Ruby
Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
...
Rails
Merci :-)
Des questions ?
Ressources
Rails Guides : http://guides.rubyonrails.org Railscasts : Peepcode : Railsfrance : http://railscasts.com http://peepcode.com ($) http://www.railsfrance.org Scaling Rails : http://railslab.newrelic.com/scaling-rails