SlideShare a Scribd company logo
1 of 201
Download to read offline
Richard Piacentini
                  Tunisia on Rails -15 Mai 2010
  © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Langage de Programmation




  © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Langage de Programmation                                  Framework Web




  © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Framework Web
      Langage de Programmation




  © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Framework Web ?




Thursday, May 20, 2010
Ensemble de
                              composants

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Socle commun


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Structure identique


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Pourquoi utiliser un
              framework ?




Thursday, May 20, 2010
Pour ne pas
                  réinventer la roue

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Pour imposer des
                      normes...

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
... Et des bonnes
                              pratiques !

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Quels sont les gains ?




Thursday, May 20, 2010
Productivité


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Réutilisation


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Économies
                                      d’échelle

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Focalisation sur la
                   valeur ajoutée

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Thursday, May 20, 2010
Les principes




Thursday, May 20, 2010
DRY


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
DRY
                           “Don’t repeat yourself !”
                           “Don’t repeat yourself !”

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
DRY
                           “Don’t repeat yourself !”


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
“Convention over
                    configuration”

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
“Opinionated
                              framework”

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Les avantages




Thursday, May 20, 2010
Ruby full-stack


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
MVC


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
MVC
                          Model / View / Controller


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Tests intégrés !


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Écrivez des tests !


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Écrivez des tests !


 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
© 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 !
                                                 É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 !
                                                 Écrivez des tests !
   Écrivez des tests !        Écrivez des tests !     Écrivez des tests !
  © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Écrivez des tests !


  © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Les composants




Thursday, May 20, 2010
ActiveRecord


                    ActionView


          ActionController


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                  Model

                    ActionView


          ActionController


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                  Model

                    ActionView                                View

          ActionController


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                  Model

                    ActionView                                View

          ActionController                                    Controller


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                  Model

                    ActionView


          ActionController


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                  Model

                    ActionView


          ActionController
                                                              }   ActionPack
                                                                  View
                                                                  Controller
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Exemple




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Exemple
                                                              http://paris.onrails.info/conferenciers




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Exemple
                                                                   http://paris.onrails.info/conferenciers
                                                         Rails
                                                         Routage




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Exemple
                                                                   http://paris.onrails.info/conferenciers
                                                         Rails     Le système de routage trouve le contrôleur
                                                                   “conférenciers
                                                         Routage




                                                   Contrôleur
                                                 “conferenciers”




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Exemple
                                                                            http://paris.onrails.info/conferenciers
                                                         Rails              Le système de routage trouve le contrôleur
                                                                            “conférenciers
                                                         Routage
                                                                            Le contrôleur interagit avec le modèle




                                                   Contrôleur
                                                 “conferenciers”




                                                                   Modèle
                                                                   Active
                                                                   Record




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Exemple
                                                                            http://paris.onrails.info/conferenciers
                                                         Rails              Le système de routage trouve le contrôleur
                                                                            “conférenciers
                                                         Routage
                                                                            Le contrôleur interagit avec le modèle




                                                   Contrôleur
                                                 “conferenciers”




                                                                   Modèle                               Base de
                                                                   Active                               données
                                                                   Record




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Exemple
                                                                            http://paris.onrails.info/conferenciers
                                                         Rails              Le système de routage trouve le contrôleur
                                                                            “conférenciers
                                                         Routage
                                                                            Le contrôleur interagit avec le modèle

                                                                            Le contrôleur invoque la vue




                                                   Contrôleur
                                                 “conferenciers”




                                                                   Modèle                               Base de
                Affichage de la
                      vue
                                                                   Active                               données
                                                                   Record




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Exemple
                                                                            http://paris.onrails.info/conferenciers
                                                         Rails              Le système de routage trouve le contrôleur
                                                                            “conférenciers
                                                         Routage
                                                                            Le contrôleur interagit avec le modèle

                                                                            Le contrôleur invoque la vue
                                                                            La vue assure le rendu du prochain écran
                                                                            du navigateur


                                                   Contrôleur
                                                 “conferenciers”




                                                                   Modèle                               Base de
                Affichage de la
                      vue
                                                                   Active                               données
                                                                   Record




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Exemple
                                                                            http://paris.onrails.info/conferenciers
                                                         Rails              Le système de routage trouve le contrôleur
                                                                            “conférenciers
                                                         Routage
                                                                            Le contrôleur interagit avec le modèle

                                                                            Le contrôleur invoque la vue
                                                                            La vue assure le rendu du prochain écran
                                                                            du navigateur


                                                   Contrôleur
                                                 “conferenciers”




                                                                   Modèle                               Base de
                Affichage de la
                      vue
                                                                   Active                               données
                                                                   Record




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

     • Connexion au SGBD




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

     • Connexion au SGBD
     • Mapping Objet-Relationnel



© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

     • Connexion au SGBD
     • Mapping Objet-Relationnel
     • Gestion des relations entre les tables


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

    user = User.new




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

    user = User.new                                            SHOW FIELDS FROM `users`




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

    user = User.new                                            SHOW FIELDS FROM `users`
    user.name = "Richard Piacentini"
    user.company = "Nuxos"




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

    user = User.new                                            SHOW FIELDS FROM `users`
    user.name = "Richard Piacentini"
    user.company = "Nuxos"
    user.save




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

    user = User.new                                            SHOW FIELDS FROM `users`
    user.name = "Richard Piacentini"
    user.company = "Nuxos"
                                                               INSERT INTO `users` (`name`, `company`)
    user.save
                                                               VALUES ('Richard Piacentini', 'Nuxos')




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

    user = User.new                                            SHOW FIELDS FROM `users`
    user.name = "Richard Piacentini"
    user.company = "Nuxos"
                                                               INSERT INTO `users` (`name`, `company`)
    user.save
                                                               VALUES ('Richard Piacentini', 'Nuxos')




    user = User.find_by_company("Nuxos")




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

    user = User.new                                            SHOW FIELDS FROM `users`
    user.name = "Richard Piacentini"
    user.company = "Nuxos"
                                                               INSERT INTO `users` (`name`, `company`)
    user.save
                                                               VALUES ('Richard Piacentini', 'Nuxos')



                                                               SELECT * FROM `users`
    user = User.find_by_company("Nuxos")
                                                               WHERE company = "Nuxos" LIMIT 1




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

    user = User.new                                            SHOW FIELDS FROM `users`
    user.name = "Richard Piacentini"
    user.company = "Nuxos"
                                                               INSERT INTO `users` (`name`, `company`)
    user.save
                                                               VALUES ('Richard Piacentini', 'Nuxos')



                                                               SELECT * FROM `users`
    user = User.find_by_company("Nuxos")
                                                               WHERE company = "Nuxos" LIMIT 1



     user.destroy




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

    user = User.new                                            SHOW FIELDS FROM `users`
    user.name = "Richard Piacentini"
    user.company = "Nuxos"
                                                               INSERT INTO `users` (`name`, `company`)
    user.save
                                                               VALUES ('Richard Piacentini', 'Nuxos')



                                                               SELECT * FROM `users`
    user = User.find_by_company("Nuxos")
                                                               WHERE company = "Nuxos" LIMIT 1



     user.destroy                                               DELETE FROM `users` WHERE id = 2




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

       • Classe <----> Table de la BD




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

       • Classe <----> Table de la BD
       • Objet <----> Enregistrement



© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

       • Classe <----> Table de la BD
       • Objet <----> Enregistrement
       • Attribut <----> Champ de la table


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model




                                  users




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end




                                  users




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end




                                  users




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end
   Classe <--> Table



                                  users




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end
   Classe <--> Table



                                  users                       id         name           company
                                                              1       Paul Durand        Orange

                                                              2    Richard Piacentini    Nuxos




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end
   Classe <--> Table



                                  users                       id         name           company
                                                              1       Paul Durand        Orange

                                                              2    Richard Piacentini    Nuxos




                                                      user = User.find_by_company("Nuxos")

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end
   Classe <--> Table



                                  users                       id         name           company
                                                              1       Paul Durand        Orange

                                                              2    Richard Piacentini    Nuxos




                                                      user = User.find_by_company("Nuxos")

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end
   Classe <--> Table



                                  users                       id         name           company
                                                              1       Paul Durand        Orange

                                                              2    Richard Piacentini    Nuxos

                                                              Objet <--> Enregistrement

                                                      user = User.find_by_company("Nuxos")

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end
                                     user.name
   Classe <--> Table



                                  users                       id         name           company
                                                              1       Paul Durand        Orange

                                                              2    Richard Piacentini    Nuxos

                                                              Objet <--> Enregistrement

                                                      user = User.find_by_company("Nuxos")

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end
                                     user.name
   Classe <--> Table



                                  users                       id         name           company
                                                              1       Paul Durand        Orange

                                                              2    Richard Piacentini    Nuxos

                                                              Objet <--> Enregistrement

                                                      user = User.find_by_company("Nuxos")

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end                                                                            user.company
                                     user.name
   Classe <--> Table



                                  users                       id         name              company
                                                              1       Paul Durand           Orange

                                                              2    Richard Piacentini       Nuxos

                                                              Objet <--> Enregistrement

                                                      user = User.find_by_company("Nuxos")

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end                                                                            user.company
                                     user.name
   Classe <--> Table



                                  users                       id         name              company
                                                              1       Paul Durand           Orange

                                                              2    Richard Piacentini       Nuxos

                                                              Objet <--> Enregistrement

                                                      user = User.find_by_company("Nuxos")

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model
         # fichier modèle app/models/user.rb
         class User < ActiveRecord::Base
         end                                                                            user.company
                                     user.name
   Classe <--> Table
                                                                          Attribut <--> Champ


                                  users                       id         name              company
                                                              1       Paul Durand           Orange

                                                              2    Richard Piacentini       Nuxos

                                                              Objet <--> Enregistrement

                                                      user = User.find_by_company("Nuxos")

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

     • Nom de la clef primaire : id




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

     • Nom de la clef primaire : id
     • Nom des table de la BD en minuscules et
     au pluriel




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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



© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

            user_invoices
         id
         user_id
         amount




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

            user_invoices
         id
         user_id
         amount



       • Table : user_invoices



© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

            user_invoices
         id
         user_id
         amount



       • Table : user_invoices
       • Fichier modèle : app/models/user_invoice.rb


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

            user_invoices
         id
         user_id
         amount



       • Table : user_invoices
       • Fichier modèle : app/models/user_invoice.rb
       • Classe Ruby : UserInvoice

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRecord                                       Model

            user_invoices                             class UserInvoice < ActiveRecord::Base
         id                                           end
         user_id
         amount



       • Table : user_invoices
       • Fichier modèle : app/models/user_invoice.rb
       • Classe Ruby : UserInvoice

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller


       •1 méthode publique = 1 action




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller


       •1 méthode publique = 1 action
       • Gestion du routage



© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller


       •1 méthode publique = 1 action
       • Gestion du routage
       • Gestion des caches (page, action,
       fragment)

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller

       •1 action…




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller

       •1 action…
       • …Plusieurs formats de réponse




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller

       •GET /users




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller

       •GET /users




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller

       •GET /users.xml




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionController                                         Controller

       •GET /users.xml




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView                                     View




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView                                     View

       • Séparation entre format et rendu




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView                                     View

       • Séparation entre format et rendu
          • HTML, Javascript, atom, iPhone




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView                                     View

       • Séparation entre format et rendu
          • HTML, Javascript, atom, iPhone
          • ERB, Builder, RJS



© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView                                     View

       • Séparation entre format et rendu
          • HTML, Javascript, atom, iPhone
          • ERB, Builder, RJS
       • Gestion des layouts (gabarits)


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView                                     View

       • Séparation 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

       • Séparation 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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView                                     View

         •ERB : Embedded Ruby




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView                                     View

        •ERB : Embedded Ruby
        • Fichier avec extension .html.erb



© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView                                     View

        •ERB : Embedded Ruby
        • Fichier avec extension .html.erb
        • Accès aux variables d’instance du
        contrôleur


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActionView                                     View

     # code Ruby non affiché dans la page <% %>
     <% @users.each |user| do %>
         # … ici code HTML ou Ruby
     <% end %>




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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) %>




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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>

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Rails 3




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Performance


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Modularité


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Sécurisé par défaut


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Prêt pour HTML5


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
API publique


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© 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 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




© 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
       :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


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveModel
       class Person
           attr_accessor :name


       end




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveModel
       class Person
           attr_accessor :name
          include ActiveModel::Validations

       end




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveModel
       class Person
            attr_accessor :name
           include ActiveModel::Validations
           validates :name, :presence => true
       end




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveModel
       class Person
            attr_accessor :name
           include ActiveModel::Validations
           validates :name, :presence => true
       end
       p = Person.new




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveModel
       class Person
            attr_accessor :name
           include ActiveModel::Validations
           validates :name, :presence => true
       end
       p = Person.new
       p.valid? # false




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveModel
       class Person
            attr_accessor :name
           include ActiveModel::Validations
           validates :name, :presence => true
       end
       p = Person.new
       p.valid? # false
       p.name = "Richard Piacentini"



© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveModel
       class Person
            attr_accessor :name
           include ActiveModel::Validations
           validates :name, :presence => true
       end
       p = Person.new
       p.valid? # false
       p.name = "Richard Piacentini"
      p.valid? # true

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation

                             • where                          • offset
                             • having                         • joins
                             • select                         • includes
                             • group                          • lock
                             • order                          • readonly
                             • limit                          • from
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation
    # Rails 2
    @users = User.find(:all, :conditions => { :active => true }




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation
    # Rails 2
    @users = User.find(:all, :conditions => { :active => true }


           Array
                                      La requête est exécutée immédiatement
                                      dans la base de données




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation
    # Rails 2
    @users = User.find(:all, :conditions => { :active => true }


           Array
                                      La requête est exécutée immédiatement
                                      dans la base de données
       # Rails 3
       @users = User.where(:active => true)




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation
    # Rails 2
    @users = User.find(:all, :conditions => { :active => true }


           Array
                                      La requête est exécutée immédiatement
                                      dans la base de données
       # Rails 3
       @users = User.where(:active => true)


                                             Pas d’appel à la base de données


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation
    # Rails 2
    @users = User.find(:all, :conditions => { :active => true }


           Array
                                      La requête est exécutée immédiatement
                                      dans la base de données
       # Rails 3
       @users = User.where(:active => true)

   ActiveRecord::Relation
        (lazy loading)                       Pas d’appel à la base de données


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation
     # Rails 3
     @users = User.order(:created_at).where(company: "Nuxos", active: true)




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation
     # Rails 3
     @users = User.order(:created_at).where(company: "Nuxos", active: true)



     @users.class # => ActiveRecord::Relation




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation
     # Rails 3
     @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’




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
ActiveRelation

       # Rails 3
      @users = User.order(:created_at).where(company: "Nuxos", active: true)



      # Rails 2
      @users = User.all(:conditions => ["company = ? AND active
      = ?", "Nuxos", true], :order => :created_at)




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Named Scopes ++


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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

     @admins = User.admin.activated
               # => retourne tous les admin activés



© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Named Scope ++
     # Rails3
    class User < ActiveRecord::Base
      scope :admin, where("is_admin = ?", true)
         scope :activated, lambda { where("activated_at ≤ ?", Time.now) }

    end




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Les scripts
                                                              Rails 2




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Les scripts
                                                              Rails 3




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Les scripts




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Les scripts




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Les scripts




                                             alias r=‘rails’
© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Et aussi...




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Et aussi...
       • Nouvelle API de routage




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Et aussi...
       • Nouvelle API de routage
       • Nouvelle architecture d’ActionController




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Et aussi...
       • Nouvelle API de routage
       • Nouvelle architecture d’ActionController
       • ActionMailer 3




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Et aussi...
       • Nouvelle API de routage
       • Nouvelle architecture d’ActionController
       • ActionMailer 3
       • Bundler


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Et aussi...
       • Nouvelle API de routage
       • Nouvelle architecture d’ActionController
       • ActionMailer 3
       • Bundler
       • ...

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Bientôt…




Thursday, May 20, 2010
Pourquoi Rails ?




Thursday, May 20, 2010
Efficace


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Tests intégrés !


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Bonnes pratiques


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Tests intégrés !


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Nombreux plugins


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Tests intégrés !


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Ruby


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Et surtout...


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Thursday, May 20, 2010
Statistiques d’utilisation des version de Rails
                                                       Janvier 2010




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Statistiques d’utilisation des version de Rails
                                                       Janvier 2010

                                                              v2.3.4            v2.3.2
                                                              v2.3.5            v2.2.2
                                                              v2.3.3            v2.1.0
                                                              v2.1.2            Others

                                                                       v2.3.5
                                                    v2.3.2              14% v2.2.2
                                                     21%                       11%
                                                                               v2.3.3
                                                                                 7%
                                                                               4%
                                                                              3%
                                              v2.3.4                   Others
                                              32.6%                      9%




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Statistiques d’utilisation des version de Ruby
                                                       Janvier 2010
                                                              v1.8.6   v1.9.1
                                                              v1.8.7   v1.8.5




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Statistiques d’utilisation des version de Ruby
                                                       Janvier 2010
                                                              v1.8.6   v1.9.1
                                                              v1.8.7   v1.8.5

                                                              v1.9.1
                                                                          v1.8.7
                                                               1%
                                                                           32%




                                                                                   v1.8.5
                                                                                    3%


                                v1.8.6
                                63.5%




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Statistiques d’utilisation des version de Ruby
                                                       Janvier 2010
                                                              v1.8.6   v1.9.1
                                                              v1.8.7   v1.8.5

                                                              v1.9.1
                                                                          v1.8.7
                                                               1%
                                                                           32%




                                                                                   v1.8.5
                                                                                    3%


                                v1.8.6
                                63.5%




        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
Littérature
                                                                                    The Well        Ruby on Rails
Programming Ruby 1.9             The Ruby Way            Design patterns en Ruby Grounded Rubyist    4th edition




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Littérature
                                                                                    The Well          Ruby on Rails
Programming Ruby 1.9             The Ruby Way            Design patterns en Ruby Grounded Rubyist      4th edition




          De Ruby                                             ...                                   Á Rails

© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Thursday, May 20, 2010
Merci :-)




Thursday, May 20, 2010
Des questions ?


© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
Ressources
    Rails 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



© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010
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/nomadiclass/4395155397/sizes/l/

                     http://www.flickr.com/photos/teddybare/133488169/

                    http://www.flickr.com/photos/mworrell/266180687/sizes/o/in/photostream/




© Richard Piacentini et Laurent Julliard 2010 - Nuxos Group
Thursday, May 20, 2010

More Related Content

Viewers also liked

la tecnologia
la tecnologiala tecnologia
la tecnologiakikucha
 
El enojo y sus consecuencias
El enojo y sus consecuenciasEl enojo y sus consecuencias
El enojo y sus consecuenciasUSET
 
Ks3 Unit 7 Gesundheit
Ks3 Unit 7 GesundheitKs3 Unit 7 Gesundheit
Ks3 Unit 7 GesundheitPGCEMaster
 
Social Media Strategie Kursergebnis: ARD
Social Media Strategie Kursergebnis: ARDSocial Media Strategie Kursergebnis: ARD
Social Media Strategie Kursergebnis: ARDFH Düsseldorf
 
Diagnostic Plu 28 05 2009
Diagnostic Plu 28 05 2009Diagnostic Plu 28 05 2009
Diagnostic Plu 28 05 2009coteaux2seine
 
Proceso gravera
Proceso graveraProceso gravera
Proceso graverajjjj
 
2008 4 27柏林
2008 4 27柏林2008 4 27柏林
2008 4 27柏林anitachen
 
wisin y yandel!
wisin y yandel!wisin y yandel!
wisin y yandel!ferna0506
 
German Personal Pronouns
German Personal PronounsGerman Personal Pronouns
German Personal PronounsPGCEMaster
 
Bibliotecas
BibliotecasBibliotecas
Bibliotecaskusschen
 
Libya
LibyaLibya
LibyaSEGA
 
Histoire de la hongrie
Histoire de la hongrieHistoire de la hongrie
Histoire de la hongriepacitina
 
Presentacion artesanos
Presentacion artesanosPresentacion artesanos
Presentacion artesanosValeria Accomo
 
Social Media Strategie Kursergebnis: RTL
Social Media Strategie Kursergebnis: RTLSocial Media Strategie Kursergebnis: RTL
Social Media Strategie Kursergebnis: RTLFH Düsseldorf
 
Premieres communions 9mai 2010
Premieres communions 9mai 2010Premieres communions 9mai 2010
Premieres communions 9mai 2010Outremeuse
 

Viewers also liked (20)

Barrancabermeja
BarrancabermejaBarrancabermeja
Barrancabermeja
 
la tecnologia
la tecnologiala tecnologia
la tecnologia
 
El enojo y sus consecuencias
El enojo y sus consecuenciasEl enojo y sus consecuencias
El enojo y sus consecuencias
 
Ks3 Unit 7 Gesundheit
Ks3 Unit 7 GesundheitKs3 Unit 7 Gesundheit
Ks3 Unit 7 Gesundheit
 
Social Media Strategie Kursergebnis: ARD
Social Media Strategie Kursergebnis: ARDSocial Media Strategie Kursergebnis: ARD
Social Media Strategie Kursergebnis: ARD
 
Diagnostic Plu 28 05 2009
Diagnostic Plu 28 05 2009Diagnostic Plu 28 05 2009
Diagnostic Plu 28 05 2009
 
Proceso gravera
Proceso graveraProceso gravera
Proceso gravera
 
2008 4 27柏林
2008 4 27柏林2008 4 27柏林
2008 4 27柏林
 
wisin y yandel!
wisin y yandel!wisin y yandel!
wisin y yandel!
 
German Personal Pronouns
German Personal PronounsGerman Personal Pronouns
German Personal Pronouns
 
Analizando
AnalizandoAnalizando
Analizando
 
DeArGe Mitteilungen 5/1998
DeArGe Mitteilungen 5/1998DeArGe Mitteilungen 5/1998
DeArGe Mitteilungen 5/1998
 
Bibliotecas
BibliotecasBibliotecas
Bibliotecas
 
Libya
LibyaLibya
Libya
 
materias (biologia)
materias (biologia)materias (biologia)
materias (biologia)
 
Histoire de la hongrie
Histoire de la hongrieHistoire de la hongrie
Histoire de la hongrie
 
Presentacion artesanos
Presentacion artesanosPresentacion artesanos
Presentacion artesanos
 
Perspectivas e impactos del PROMIPYME
Perspectivas e impactos del PROMIPYMEPerspectivas e impactos del PROMIPYME
Perspectivas e impactos del PROMIPYME
 
Social Media Strategie Kursergebnis: RTL
Social Media Strategie Kursergebnis: RTLSocial Media Strategie Kursergebnis: RTL
Social Media Strategie Kursergebnis: RTL
 
Premieres communions 9mai 2010
Premieres communions 9mai 2010Premieres communions 9mai 2010
Premieres communions 9mai 2010
 

Recently uploaded

Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 

Recently uploaded (20)

Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 

Tunisia on Rails 2010

  • 1. Richard Piacentini Tunisia on Rails -15 Mai 2010 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 2. © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 3. Langage de Programmation © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 4. Langage de Programmation Framework Web © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 5. Framework Web Langage de Programmation © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 7. Ensemble de composants © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 8. Socle commun © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 9. Structure identique © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 10. Pourquoi utiliser un framework ? Thursday, May 20, 2010
  • 11. Pour ne pas réinventer la roue © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 12. Pour imposer des normes... © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 13. ... Et des bonnes pratiques ! © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 14. Quels sont les gains ? Thursday, May 20, 2010
  • 15. Productivité © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 16. Réutilisation © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 17. Économies d’échelle © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 18. Focalisation sur la valeur ajoutée © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 21. DRY © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 22. DRY “Don’t repeat yourself !” “Don’t repeat yourself !” © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 23. DRY “Don’t repeat yourself !” © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 24. “Convention over configuration” © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 25. “Opinionated framework” © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 27. Ruby full-stack © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 28. MVC © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 29. MVC Model / View / Controller © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 30. Tests intégrés ! © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 31. © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 32. Écrivez des tests ! © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 33. © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 34. Écrivez des tests ! © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 35. © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 36. É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
  • 37. É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
  • 38. © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 39. Écrivez des tests ! © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 41. ActiveRecord ActionView ActionController © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 42. ActiveRecord Model ActionView ActionController © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 43. ActiveRecord Model ActionView View ActionController © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 44. ActiveRecord Model ActionView View ActionController Controller © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 45. ActiveRecord Model ActionView ActionController © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 46. ActiveRecord Model ActionView ActionController } ActionPack View Controller © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 47. Exemple © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 48. Exemple http://paris.onrails.info/conferenciers © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 49. Exemple http://paris.onrails.info/conferenciers Rails Routage © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 50. Exemple http://paris.onrails.info/conferenciers Rails Le système de routage trouve le contrôleur “conférenciers Routage Contrôleur “conferenciers” © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 51. Exemple http://paris.onrails.info/conferenciers Rails Le système de routage trouve le contrôleur “conférenciers Routage Le contrôleur interagit avec le modèle Contrôleur “conferenciers” Modèle Active Record © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 52. Exemple http://paris.onrails.info/conferenciers Rails Le système de routage trouve le contrôleur “conférenciers Routage Le contrôleur interagit avec le modèle Contrôleur “conferenciers” Modèle Base de Active données Record © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 53. Exemple http://paris.onrails.info/conferenciers Rails Le système de routage trouve le contrôleur “conférenciers Routage Le contrôleur interagit avec le modèle Le contrôleur invoque la vue Contrôleur “conferenciers” Modèle Base de Affichage de la vue Active données Record © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 54. Exemple http://paris.onrails.info/conferenciers Rails Le système de routage trouve le contrôleur “conférenciers Routage Le contrôleur interagit avec le modèle Le contrôleur invoque la vue La vue assure le rendu du prochain écran du navigateur Contrôleur “conferenciers” Modèle Base de Affichage de la vue Active données Record © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 55. Exemple http://paris.onrails.info/conferenciers Rails Le système de routage trouve le contrôleur “conférenciers Routage Le contrôleur interagit avec le modèle Le contrôleur invoque la vue La vue assure le rendu du prochain écran du navigateur Contrôleur “conferenciers” Modèle Base de Affichage de la vue Active données Record © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 56. ActiveRecord Model © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 57. ActiveRecord Model • Connexion au SGBD © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 58. ActiveRecord Model • Connexion au SGBD • Mapping Objet-Relationnel © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 59. ActiveRecord Model • Connexion au SGBD • Mapping Objet-Relationnel • Gestion des relations entre les tables © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 60. 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
  • 61. ActiveRecord Model © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 62. ActiveRecord Model user = User.new © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 63. ActiveRecord Model user = User.new SHOW FIELDS FROM `users` © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 64. ActiveRecord Model user = User.new SHOW FIELDS FROM `users` user.name = "Richard Piacentini" user.company = "Nuxos" © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 65. ActiveRecord Model user = User.new SHOW FIELDS FROM `users` user.name = "Richard Piacentini" user.company = "Nuxos" user.save © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 66. ActiveRecord Model user = User.new SHOW FIELDS FROM `users` user.name = "Richard Piacentini" user.company = "Nuxos" INSERT INTO `users` (`name`, `company`) user.save VALUES ('Richard Piacentini', 'Nuxos') © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 67. ActiveRecord Model user = User.new SHOW FIELDS FROM `users` user.name = "Richard Piacentini" user.company = "Nuxos" INSERT INTO `users` (`name`, `company`) user.save VALUES ('Richard Piacentini', 'Nuxos') user = User.find_by_company("Nuxos") © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 68. ActiveRecord Model user = User.new SHOW FIELDS FROM `users` user.name = "Richard Piacentini" user.company = "Nuxos" INSERT INTO `users` (`name`, `company`) user.save VALUES ('Richard Piacentini', 'Nuxos') SELECT * FROM `users` user = User.find_by_company("Nuxos") WHERE company = "Nuxos" LIMIT 1 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 69. ActiveRecord Model user = User.new SHOW FIELDS FROM `users` user.name = "Richard Piacentini" user.company = "Nuxos" INSERT INTO `users` (`name`, `company`) user.save VALUES ('Richard Piacentini', 'Nuxos') SELECT * FROM `users` user = User.find_by_company("Nuxos") WHERE company = "Nuxos" LIMIT 1 user.destroy © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 70. ActiveRecord Model user = User.new SHOW FIELDS FROM `users` user.name = "Richard Piacentini" user.company = "Nuxos" INSERT INTO `users` (`name`, `company`) user.save VALUES ('Richard Piacentini', 'Nuxos') SELECT * FROM `users` user = User.find_by_company("Nuxos") WHERE company = "Nuxos" LIMIT 1 user.destroy DELETE FROM `users` WHERE id = 2 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 71. ActiveRecord Model © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 72. ActiveRecord Model • Classe <----> Table de la BD © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 73. ActiveRecord Model • Classe <----> Table de la BD • Objet <----> Enregistrement © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 74. ActiveRecord Model • Classe <----> Table de la BD • Objet <----> Enregistrement • Attribut <----> Champ de la table © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 75. ActiveRecord Model users © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 76. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end users © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 77. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end users © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 78. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end Classe <--> Table users © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 79. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end Classe <--> Table users id name company 1 Paul Durand Orange 2 Richard Piacentini Nuxos © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 80. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end Classe <--> Table users id name company 1 Paul Durand Orange 2 Richard Piacentini Nuxos user = User.find_by_company("Nuxos") © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 81. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end Classe <--> Table users id name company 1 Paul Durand Orange 2 Richard Piacentini Nuxos user = User.find_by_company("Nuxos") © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 82. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end Classe <--> Table users id name company 1 Paul Durand Orange 2 Richard Piacentini Nuxos Objet <--> Enregistrement user = User.find_by_company("Nuxos") © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 83. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end user.name Classe <--> Table users id name company 1 Paul Durand Orange 2 Richard Piacentini Nuxos Objet <--> Enregistrement user = User.find_by_company("Nuxos") © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 84. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end user.name Classe <--> Table users id name company 1 Paul Durand Orange 2 Richard Piacentini Nuxos Objet <--> Enregistrement user = User.find_by_company("Nuxos") © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 85. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end user.company user.name Classe <--> Table users id name company 1 Paul Durand Orange 2 Richard Piacentini Nuxos Objet <--> Enregistrement user = User.find_by_company("Nuxos") © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 86. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end user.company user.name Classe <--> Table users id name company 1 Paul Durand Orange 2 Richard Piacentini Nuxos Objet <--> Enregistrement user = User.find_by_company("Nuxos") © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 87. ActiveRecord Model # fichier modèle app/models/user.rb class User < ActiveRecord::Base end user.company user.name Classe <--> Table Attribut <--> Champ users id name company 1 Paul Durand Orange 2 Richard Piacentini Nuxos Objet <--> Enregistrement user = User.find_by_company("Nuxos") © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 88. ActiveRecord Model © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 89. ActiveRecord Model • Nom de la clef primaire : id © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 90. ActiveRecord Model • Nom de la clef primaire : id • Nom des table de la BD en minuscules et au pluriel © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 91. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 92. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 93. ActiveRecord Model user_invoices id user_id amount © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 94. ActiveRecord Model user_invoices id user_id amount • Table : user_invoices © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 95. ActiveRecord Model user_invoices id user_id amount • Table : user_invoices • Fichier modèle : app/models/user_invoice.rb © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 96. ActiveRecord Model user_invoices id user_id amount • Table : user_invoices • Fichier modèle : app/models/user_invoice.rb • Classe Ruby : UserInvoice © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 97. ActiveRecord Model user_invoices class UserInvoice < ActiveRecord::Base id end user_id amount • Table : user_invoices • Fichier modèle : app/models/user_invoice.rb • Classe Ruby : UserInvoice © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 98. ActionController Controller © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 99. ActionController Controller •1 méthode publique = 1 action © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 100. ActionController Controller •1 méthode publique = 1 action • Gestion du routage © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 101. ActionController Controller •1 méthode publique = 1 action • Gestion du routage • Gestion des caches (page, action, fragment) © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 102. ActionController Controller © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 103. ActionController Controller •1 action… © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 104. ActionController Controller •1 action… • …Plusieurs formats de réponse © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 105. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 106. ActionController Controller •GET /users © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 107. ActionController Controller •GET /users © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 108. ActionController Controller •GET /users.xml © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 109. ActionController Controller •GET /users.xml © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 110. ActionView View © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 111. ActionView View • Séparation entre format et rendu © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 112. ActionView View • Séparation entre format et rendu • HTML, Javascript, atom, iPhone © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 113. ActionView View • Séparation entre format et rendu • HTML, Javascript, atom, iPhone • ERB, Builder, RJS © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 114. ActionView View • Séparation entre format et rendu • HTML, Javascript, atom, iPhone • ERB, Builder, RJS • Gestion des layouts (gabarits) © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 115. ActionView View • Séparation 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
  • 116. ActionView View • Séparation 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
  • 117. ActionView View © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 118. ActionView View •ERB : Embedded Ruby © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 119. ActionView View •ERB : Embedded Ruby • Fichier avec extension .html.erb © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 120. ActionView View •ERB : Embedded Ruby • Fichier avec extension .html.erb • Accès aux variables d’instance du contrôleur © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 121. ActionView View # code Ruby non affiché dans la page <% %> <% @users.each |user| do %> # … ici code HTML ou Ruby <% end %> © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 122. 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) %> © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 123. 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> © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 124. Rails 3 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 125. Performance © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 126. Modularité © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 127. Sécurisé par défaut © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 128. Prêt pour HTML5 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 129. API publique © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 130. Nouveaux Validateurs © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 131. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 132. 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
  • 133. 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
  • 134. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 135. 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
  • 136. ActiveModel © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 137. ActiveModel class Person attr_accessor :name end © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 138. ActiveModel class Person attr_accessor :name include ActiveModel::Validations end © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 139. ActiveModel class Person attr_accessor :name include ActiveModel::Validations validates :name, :presence => true end © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 140. ActiveModel class Person attr_accessor :name include ActiveModel::Validations validates :name, :presence => true end p = Person.new © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 141. ActiveModel class Person attr_accessor :name include ActiveModel::Validations validates :name, :presence => true end p = Person.new p.valid? # false © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 142. ActiveModel class Person attr_accessor :name include ActiveModel::Validations validates :name, :presence => true end p = Person.new p.valid? # false p.name = "Richard Piacentini" © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 143. ActiveModel class Person attr_accessor :name include ActiveModel::Validations validates :name, :presence => true end p = Person.new p.valid? # false p.name = "Richard Piacentini" p.valid? # true © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 144. ActiveRelation © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 145. ActiveRelation © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 146. ActiveRelation • where • offset • having • joins • select • includes • group • lock • order • readonly • limit • from © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 147. ActiveRelation # Rails 2 @users = User.find(:all, :conditions => { :active => true } © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 148. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 149. ActiveRelation # Rails 2 @users = User.find(:all, :conditions => { :active => true } Array La requête est exécutée immédiatement dans la base de données © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 150. ActiveRelation # Rails 2 @users = User.find(:all, :conditions => { :active => true } Array La requête est exécutée immédiatement dans la base de données # Rails 3 @users = User.where(:active => true) © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 151. ActiveRelation # Rails 2 @users = User.find(:all, :conditions => { :active => true } Array La requête est exécutée immédiatement dans la base de données # Rails 3 @users = User.where(:active => true) Pas d’appel à la base de données © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 152. ActiveRelation # Rails 2 @users = User.find(:all, :conditions => { :active => true } Array La requête est exécutée immédiatement dans la base de données # Rails 3 @users = User.where(:active => true) ActiveRecord::Relation (lazy loading) Pas d’appel à la base de données © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 153. ActiveRelation # Rails 3 @users = User.order(:created_at).where(company: "Nuxos", active: true) © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 154. ActiveRelation # Rails 3 @users = User.order(:created_at).where(company: "Nuxos", active: true) @users.class # => ActiveRecord::Relation © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 155. ActiveRelation # Rails 3 @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’ © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 156. ActiveRelation # Rails 3 @users = User.order(:created_at).where(company: "Nuxos", active: true) # Rails 2 @users = User.all(:conditions => ["company = ? AND active = ?", "Nuxos", true], :order => :created_at) © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 157. Named Scopes ++ © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 158. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 159. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 160. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 161. 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 @admins = User.admin.activated # => retourne tous les admin activés © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 162. Named Scope ++ # Rails3 class User < ActiveRecord::Base scope :admin, where("is_admin = ?", true) scope :activated, lambda { where("activated_at ≤ ?", Time.now) } end © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 163. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 164. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 165. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 166. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 167. 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 168. Les scripts Rails 2 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 169. Les scripts Rails 3 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 170. Les scripts © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 171. Les scripts © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 172. Les scripts alias r=‘rails’ © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 173. Et aussi... © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 174. Et aussi... • Nouvelle API de routage © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 175. Et aussi... • Nouvelle API de routage • Nouvelle architecture d’ActionController © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 176. Et aussi... • Nouvelle API de routage • Nouvelle architecture d’ActionController • ActionMailer 3 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 177. Et aussi... • Nouvelle API de routage • Nouvelle architecture d’ActionController • ActionMailer 3 • Bundler © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 178. Et aussi... • Nouvelle API de routage • Nouvelle architecture d’ActionController • ActionMailer 3 • Bundler • ... © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 180. Pourquoi Rails ? Thursday, May 20, 2010
  • 181. Efficace © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 182. Tests intégrés ! © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 183. Bonnes pratiques © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 184. Tests intégrés ! © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 185. Nombreux plugins © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 186. Tests intégrés ! © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 187. Ruby © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 188. Et surtout... © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 190. Statistiques d’utilisation des version de Rails Janvier 2010 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 191. Statistiques d’utilisation des version de Rails Janvier 2010 v2.3.4 v2.3.2 v2.3.5 v2.2.2 v2.3.3 v2.1.0 v2.1.2 Others v2.3.5 v2.3.2 14% v2.2.2 21% 11% v2.3.3 7% 4% 3% v2.3.4 Others 32.6% 9% © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 192. Statistiques d’utilisation des version de Ruby Janvier 2010 v1.8.6 v1.9.1 v1.8.7 v1.8.5 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 193. Statistiques d’utilisation des version de Ruby Janvier 2010 v1.8.6 v1.9.1 v1.8.7 v1.8.5 v1.9.1 v1.8.7 1% 32% v1.8.5 3% v1.8.6 63.5% © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 194. Statistiques d’utilisation des version de Ruby Janvier 2010 v1.8.6 v1.9.1 v1.8.7 v1.8.5 v1.9.1 v1.8.7 1% 32% v1.8.5 3% v1.8.6 63.5% 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
  • 195. Littérature The Well Ruby on Rails Programming Ruby 1.9 The Ruby Way Design patterns en Ruby Grounded Rubyist 4th edition © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 196. Littérature The Well Ruby on Rails Programming Ruby 1.9 The Ruby Way Design patterns en Ruby Grounded Rubyist 4th edition De Ruby ... Á Rails © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 199. Des questions ? © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 200. Ressources Rails 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 © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010
  • 201. 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/nomadiclass/4395155397/sizes/l/ http://www.flickr.com/photos/teddybare/133488169/ http://www.flickr.com/photos/mworrell/266180687/sizes/o/in/photostream/ © Richard Piacentini et Laurent Julliard 2010 - Nuxos Group Thursday, May 20, 2010