Ruby on Rails 3 est là

Posté par  (site web personnel) . Modéré par Nÿco.
Étiquettes :
30
31
août
2010
Ruby
Ruby on Rails est un framework de développement web en Ruby, sous licence MIT. Depuis son lancement en 2004, il a permis le développement de nombreuses applications web comme Basecamp, Twitter, Github, etc.

Le 23 décembre 2008, les équipes développant Ruby on Rails et Merb, un autre framework web en Ruby, ont décidé d'unir leur effort. La fusion des deux frameworks visait à apporter le meilleur des deux dans un seul produit qui serait Rails 3.

On peut aujourd'hui affirmer que c'est une réussite. En effet, la sortie de Rails 3 a été annoncée et la liste des changements est impressionnante (cf la seconde partie de la dépêche). Remercions au passage les 1600+ personnes qui ont contribué à Ruby on Rails.

Cette nouvelle version de Rails est compatible avec Ruby 1.8.7, Ruby 1.9.2 et JRuby 1.5. Elle fonctionne également avec Rubinius 1.0 (mais sans garantie de la part de la core team Rails pour les versions 3.0.x à venir). Il ne vous reste plus qu'à lancer un gem install rails --version 3.0.0 pour l'installer.

Dernière chose, si vous appréciez Rails 3 et que vous souhaitez donner en retour, la core team de Rails vous encourage à faire un don à l'association Charity:Water. Les changements apportés par Rails 3 sont très nombreux et il est difficile d'en donner une liste exhaustive. Voici les principaux :

Nouveau moteur de requêtage pour Active Record

Active Record repose maintenant sur la bibliothèque ARel. Elle propose une nouvelle API permettant de construire de manière plus souple les requêtes, en tirant notamment profit des scopes et en retardant l'exécution de la requête jusqu'au moment où les données sont vraiment nécessaires.

Exemple :

users = User.where(:name => "david").limit(20)

users = users.where("age > 29")

# SELECT * FROM users
# WHERE name = "david" AND age > 29
# ORDER BY name
# LIMIT 20
users.order(:name).each { |user| puts user.name }


Nouveau routeur pour Action Controller

Action Controller bénéficie d'améliorations diverses comme les Responders, mais la plus marquante est la réécriture du système de routage des requêtes. Celui-ci offre une plus grande flexibilité et privilégie encore plus le style REST.

Exemple :

resources :people do

resource :avatar

collection do
get :winners, :losers
end
end

# /sd34fgh/rooms
scope ':token', :token => /\w{5,5}/ do
resources :rooms
end

# /descriptions
# /pl/descriptions
# /en/descriptions
scope '(:locale)', :locale => /en|pl/ do
resources :descriptions
root :to => 'projects#index'
end


Nouveau Action Mailer

Action mailer est un autre composant à avoir été complètement ré-écrit. Il repose maintenant sur la nouvelle bibliothèque Mail et simplifie l'écriture des mailers. En particulier, là où les mailers étaient un mélange pas très heureux entre modèles et contrôleurs dans Rails 2, ils sont tombés entièrement dans le camp des contrôleurs dans Rails 3, et à l'usage, cela s'avère un choix judicieux.

Exemple :

class Notifier < ActionMailer::Base

default :from =>
"Highrise "

def new_project(digest, project, person)
@digest, @project, @person = digest, project, person

attachments['digest.pdf'] = digest.to_pdf
attachments['logo.jpg'] = File.read(project.logo_path)

mail(
:subject => "Your digest for #{project.name}",
:to => person.email_address_with_name
) do |format|
format.text { render :text => "Something texty" }
format.html { render :text => "Something texty" }
end
end
end


Gestion des dépendances avec Bundler

Jusqu'à il y a peu la gestion des dépendances d'une application Rails était un terrain compliqué, souvent source de problèmes. L'arrivée de bundler résout ces problèmes de manière redoutablement efficace.

Protection XSS par défaut

Voilà une fonctionnalité que j'attendais depuis longtemps. Rails a toujours été bien équipé pour protéger ses applications du grand méchant 'ternet. Pourtant dans Rails 2.3, il fallait encore échapper manuellement les entrées de l'utilisateur dans les pages avec le helper h pour se protéger des attaques XSS. Rails 3 a suivi l'exemple de Django, et la protection contre les attaques XSS est maintenant réalisée par défaut. Ainsi, on ne déclare plus que les entrées à ne pas échapper avec le helper raw.

Prise en charge des encodages

Un travail important a été fait dans Rails 3 sur la prise en charge des encodages de caractères. Cela devrait limiter fortement les risques de mélanger des encodages qui conduisent à des pages pleine de �.

Extraction d'Active Model

Certaines fonctionnalités d'Active Record ont été extraites dans un nouveau composant, Active Model. Ainsi, d'autres ORM qu'Active Record peuvent bénéficier de ce travail et profiter des règles de validation, des callbacks et de la prise en charge de l'internationalisation que l'on a l'habitude de voir dans Active Record. Cela permet également aux ORM qui implémentent une interface clairement définie dans Active Model de s'intégrer au mieux dans Rails (la création de formulaires associés à ces objets par exemple).

Des API officielles pour les plugins

Les plugins pourront maintenant utiliser des API officielles et stables. Leurs développeurs n'auront ainsi plus à jouer aux devinettes pour savoir quelles méthodes de Rails ils peuvent utiliser dans leurs plugins et si celles-ci ne risquent pas de changer complètement dans la prochaine version de Rails.

Par exemple, l'API Railtie rend possible la modification des générateurs, l'ajout de tâches Rake, la configuration par défaut des options de Rails et le chargement de code au moment souhaité.

Réécritures internes

Un travail important de refactoring du code interne a permis de mieux découpler les composants, de proposer plus de points d'intégration aux plugins et d'améliorer les performances.

Agnosticisme

Une conséquence directe du point précédent est qu'il maintenant bien plus facile de remplacer un composant de Rails par un autre. Par exemple, si vous préférez jQuery à Prototype (et je vous comprends), ce n'est pas un problème pour l'utiliser avec Rails. Pareil si vous préférez rspec à test/unit ou DataMapper à Active Record.

Aller plus loin

  • # Tutoriel

    Posté par  (site web personnel) . Évalué à 9.

    Et pour ceux qui voudraient se lancer, la communauté a mis à disposition un tutoriel accessible en ligne : http://railstutorial.org/chapters/beginning
    A noter qu'une version papier (ou PDF) peut être commandée.
  • # linuxfr

    Posté par  . Évalué à 10.

    Et vous pouvez directement aller su le site web linuxfr qui est en ruby on rails 3 et qui se veut une vitrine de la technique!

    (...)
    Ah, bon, on me signale que non :)
    • [^] # Re: linuxfr

      Posté par  (site web personnel) . Évalué à 10.

      si si, pour l'instant c'est décentralisé sur localhost, il suffit d'instancier http://github.com/nono/linuxfr.org

      (il paraît qu'une alpha existe mais en manque d'une CSS avec des caractères moins gros et la migration des CSS existantes qui n'a pas encore été faite, volontaires les bienvenus, la css blue montrant le besoin de personnes prêtes à adapter les belles css actuellement disponibles aux nouvelles possibilités :D)

      - le wiki a été activé pour permettre de lister les fonctionnalités en place, identifier les tests de non-régression à faire, documenter les nouvelles fonctionnalités pouvant être utiles
      - le bug tracker a été activé aussi pour permettre de suivre l'évolution de façon pérenne et permettre de remonter les patchs / comportements à améliorer (si une analyse de sécurité motive certains, ils sont les bienvenus)

      les compétences ?
      - savoir tester et remonter des bugs
      - être force de proposition, que ce soit en ruby, en javascript, en css ou tout simplement en suggestions de fonctionnalités comme une refonte de la tribune en xmpp (en réussissant à trouver des bibliothèques pérennes)
      - réussir à trouver la ML de dév'
      - savoir rédiger des dépêches, hum ah non, ça c'est déjà possible tout de suite ;-)
  • # j'y connais rien mais....

    Posté par  . Évalué à 3.

    Dans l'exemple pour l'active record, le .Limit(20), ne devrait-il pas être sur la deuxième ligne pour être équivalent à la requête SQL?
    • [^] # Re: j'y connais rien mais....

      Posté par  . Évalué à 2.

      Hmmm, à moins que quelque chose ne m'aie échappé, première ou deuxième ligne donneront un résultat équivalent.

      On peut voir la variable users comme faisant référence à une requête en cours de construction. On y ajoute des filtres, des limites et compagnie dans l'ordre qu'on veux (première ou deuxième ligne).

      La requête (qui englobera toutes ces contraintes) n'est construite et exécutée que bien plus tard, au moment ou on tente d'accéder à son résultat (ils appellent ça lazy evaluation si mes souvenirs sont corrects).
      • [^] # Re: j'y connais rien mais....

        Posté par  . Évalué à 1.

        Si l'ensemble "users" résultant de la première ligne comporte des éléments ne remplissant pas la condition "age < 29", et que certains éléments exclus de "users" par la condition "limit(20)" remplissent la condition "age < 29", alors le positionnement de "limit(20)" influera sur le résultat.

        Il me semple que la requête SQL correspond à un "limit(20)" à la 2° ligne (la clause SQL "LIMIT" s'appliquant "en dernier")
        • [^] # Re: j'y connais rien mais....

          Posté par  . Évalué à 3.

          C'est parfaitement cohérent. Mais je ne suis pas certain qu'Arel tienne compte de ce cas. Je viens de faire un petit test rapide, et dans les deux cas la requête générée a été :

          SELECT "users".* FROM "users" WHERE ("users"."name" = 'david') AND (age > 29) LIMIT 20
          (pour Sqlite)

          Je ne serais donc pas étonné que chaque mot clé SQL soit placé de façon fixe par Arel, et que le LIMIT prenne place à la fin.

          A moins qu'il n'y aie un biais dans mon test (je ne suis pas à l'aise en DB) ?
          • [^] # Re: j'y connais rien mais....

            Posté par  . Évalué à 2.

            A coté de mes pompes, j'avais oublié la clause order. Mais ça ne change rien, la requête est

            SELECT "users".* FROM "users" WHERE ("users"."name" = 'david') AND (age > 29) ORDER BY name LIMIT 20

            quel que soit l'ordre des appels aux méthodes.
            • [^] # Re: j'y connais rien mais....

              Posté par  . Évalué à 2.

              Oui, j'aurais dis que l'ordre avait un sens.

              Si c'est pas le cas, je suis un peu déçu....
              • [^] # Re: j'y connais rien mais....

                Posté par  . Évalué à 1.

                Oui !

                N'empêche que ce truc est super pratique par exemple pour un cas que je rencontre souvent au boulot :

                Un formulaire de recherche sur une table avec une tonne de champs en tous genres, dont la plupart sont facultatifs ainsi que de la pagination. Sans ce genre de choses, les deux seules solutions sont :

                - Soit construire manuellement du SQL en concaténant des chaines dans tous les coins : code bien long, pénible à maintenir et pas très rubyesque, pas trop d'abstraction de la base de donnée, pénible à tester (tu as toujours une combinaison ou l'autre qui te donnera une requête incohérente...)

                - Soit faire un gros select bourrin sur tout et faire les tris, filtres et compagnie en ruby sur l'Array retourné en résultat. Autant dire que niveau perfs (RAM et CPU) c'est pas franchement drôle, PostgreSQL (ou autre) est quand même solidement plus à sa place que ruby pour manipuler des gros volumes de données.

                Avec ce système, tu en arrives à un code super court et lisible à la ActiveRecord, et tu n'as qu'une requête SQL sur mesure générée à la fin.
              • [^] # Re: j'y connais rien mais....

                Posté par  . Évalué à 2.

                Je suppose que si tu es déçu, c’est que tu cherchais quelque chose comme arel ? [http://github.com/nkallen/arel]
  • # Hébergeurs

    Posté par  . Évalué à 2.

    Maintenant, il faudrait que RoR soit disponible chez les hébergeurs "grand public" ... parce que en ce moment c'est soit PHP4 soit PHP5. Sorti du couple gagnant, point de salut pour avoir quelque-chose d'universel.
    • [^] # Re: Hébergeurs

      Posté par  (Mastodon) . Évalué à 1.

      Ayant installé pas mal de site Rails, il y a des années, au début de la techno, je pensais que le gros obstacle à la mise en place sur des hébergeurs grand publics était la difficulté de déploiement.

      Récemment, j'ai trouvé un hébergeur qui me permet d'avoir facilement autant d'appli rails que je veux, installées très simplement, c'est Dreamhost. C'est un peu plus cher qu'un hébergeur gratuit, ça coûte tout de même $9 par mois, mais c'est bien foutu, on a un accès SSH sur une machine possédant tous les outils nécessaires (dont Subversion), bref, pour l'instant je suis content de l'investissement. Pour installer un site, je n'ai qu'à faire un checkout svn, créer un sous-domaine dans l'interface web, et cocher une case.

      [pub]Il y a un système de parainage qui permet de payer moins cher, donc si jamais je donnais envie à des gens d'essayer, vous pouvez utiliser le code ELECTRICGOAT, et si vous poursuivez au delà de la période d'essai gratuite, vous gagnerez $50 et moi $47 sur nos factures respectives.[/pub]
      • [^] # Re: Hébergeurs

        Posté par  (site web personnel) . Évalué à 2.

        ah bah si t'étais partant pour le mettre chez un hébergeur libre, ça pourrait marcher :)
        http://faq.tuxfamily.org/index.php?title=WebArea/Fr&sect(...)
        ya au moins une demande http://forum.tuxfamily.org/viewtopic.php?id=63
        tant que c'est dans debian et maintenable avec mises à jour de sécurité... (sinon faut se poser des questions ou avoir une équipe pour s'en occuper spécifiquement).
        • [^] # Re: Hébergeurs

          Posté par  (Mastodon) . Évalué à 1.

          Encore faut-il avoir les compétences pour ça. Je suis développeur, pas administrateur système, et autant je me sens capable de bricoler pour déployer un site, autant mettre ça en place dans un environnement multi-utilisateurs doit demander un peu plus d'expérience.

          Je revendique tout à fait d'être simple utilisateur, pour certains usages. D'autant que, Dreamhost m'offrant un SSH sur une machine GNU/Linux, il n'y a guère que son interface web pour ajouter des domaines qui ne soit pas libre, et j'arriverai à m'en remettre :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.