SlideShare una empresa de Scribd logo
1 de 201
Descargar para leer sin conexión
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

Más contenido relacionado

Destacado

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
 

Destacado (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
 

Último

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 

Último (20)

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

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