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
- Annonce de la sortie de Rails 3 (10 clics)
- Rails Has Great Documentation (16 clics)
- Rails 3.0 Released (And 22 Free Videos to Bring You up to Speed) (10 clics)
- Ruby on Rails 3 Tutorial (59 clics)
- Les guides Ruby on Rails (25 clics)
- Passer de Ruby on Rails 2 au tout nouveau Rails 3 (87 clics)
# Tutoriel
Posté par Thomas J. (site web personnel) . Évalué à 9.
A noter qu'une version papier (ou PDF) peut être commandée.
[^] # Re: Tutoriel
Posté par Waine Kerr (site web personnel) . Évalué à 2.
# linuxfr
Posté par octane . Évalué à 10.
(...)
Ah, bon, on me signale que non :)
[^] # Re: linuxfr
Posté par BAud (site web personnel) . Évalué à 10.
(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 cosmocat . Évalué à 3.
[^] # Re: j'y connais rien mais....
Posté par niconoe . Évalué à 2.
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 Hugo F . Évalué à 1.
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 niconoe . Évalué à 3.
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 niconoe . Évalué à 2.
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 cosmocat . Évalué à 2.
Si c'est pas le cas, je suis un peu déçu....
[^] # Re: j'y connais rien mais....
Posté par niconoe . Évalué à 1.
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 Moonz . Évalué à 2.
[^] # Re: j'y connais rien mais....
Posté par MsieurHappy . Évalué à 1.
dans la dépêche. Donc le problème ne serait pas le même ?
[^] # Re: j'y connais rien mais....
Posté par Moonz . Évalué à 2.
# Hébergeurs
Posté par GaGadget . Évalué à 2.
[^] # Re: Hébergeurs
Posté par Yusei (Mastodon) . Évalué à 1.
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 BAud (site web personnel) . Évalué à 2.
http://faq.tuxfamily.org/index.php?title=WebArea/Fr§(...)
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 Yusei (Mastodon) . Évalué à 1.
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.