edge
Plus sur rubyonrails.org: Plus de Ruby on Rails

Ruby on Rails 4.0 Notes de version

Points forts de Rails 4.0 :

Ces notes de version ne couvrent que les changements majeurs. Pour en savoir plus sur les corrections de bugs et les changements divers, veuillez vous référer aux journaux des modifications ou consulter la liste des validations dans le dépôt principal de Rails sur GitHub.

1 Mise à niveau vers Rails 4.0

Si vous mettez à niveau une application existante, il est recommandé d'avoir une bonne couverture de tests avant de commencer. Vous devriez également d'abord passer à Rails 3.2 au cas où vous ne l'auriez pas déjà fait et vous assurer que votre application fonctionne toujours comme prévu avant de tenter une mise à jour vers Rails 4.0. Une liste de points à surveiller lors de la mise à niveau est disponible dans le guide Mise à niveau de Ruby on Rails.

2 Création d'une application Rails 4.0

# Vous devez avoir le RubyGem 'rails' installé
$ rails new myapp
$ cd myapp

2.1 Vendoring Gems

Rails utilise maintenant un Gemfile à la racine de l'application pour déterminer les gems dont vous avez besoin pour démarrer votre application. Ce Gemfile est traité par le gem Bundler, qui installe ensuite toutes vos dépendances. Il peut même installer toutes les dépendances localement à votre application afin qu'elle ne dépende pas des gems système.

Plus d'informations : Page d'accueil de Bundler

2.2 Vivre au bord du gouffre

Bundler et Gemfile rendent le gel de votre application Rails aussi facile que de manger une tarte avec la nouvelle commande bundle dédiée. Si vous souhaitez regrouper directement depuis le dépôt Git, vous pouvez passer le drapeau --edge :

$ rails new myapp --edge

Si vous avez une copie locale du dépôt Rails et que vous souhaitez générer une application à partir de celle-ci, vous pouvez passer le drapeau --dev :

$ ruby /chemin/vers/rails/railties/bin/rails new myapp --dev

3 Fonctionnalités majeures

Rails 4.0

3.1 Mise à niveau

  • Ruby 1.9.3 (validation) - Ruby 2.0 préféré ; 1.9.3+ requis
  • Nouvelle politique de dépréciation - Les fonctionnalités dépréciées sont des avertissements dans Rails 4.0 et seront supprimées dans Rails 4.1.
  • ActionPack page et action caching (validation) - Le caching de page et d'action est extrait dans un gem séparé. Le caching de page et d'action nécessite trop d'interventions manuelles (expiration manuelle des caches lorsque les objets modèle sous-jacents sont mis à jour). Utilisez plutôt le caching Russian doll.
  • ActiveRecord observers (validation) - Les observers sont extraits dans un gem séparé. Les observers ne sont nécessaires que pour le caching de page et d'action, et peuvent conduire à un code spaghetti.
  • ActiveRecord session store (validation) - Le stockage des sessions ActiveRecord est extrait dans un gem séparé. Stocker les sessions en SQL est coûteux. Utilisez plutôt les sessions de cookies, les sessions de memcache ou un stockage de sessions personnalisé.
  • Protection contre les affectations massives ActiveModel (validation) - La protection contre les affectations massives de Rails 3 est dépréciée. Utilisez plutôt les strong parameters.
  • ActiveResource (validation) - ActiveResource est extrait dans un gem séparé. ActiveResource n'était pas largement utilisé.
  • vendor/plugins supprimé (validation) - Utilisez un Gemfile pour gérer les gems installées.

3.2 ActionPack

  • Strong parameters (validation) - N'autorisez que les paramètres autorisés à mettre à jour les objets modèle (params.permit(:title, :text)).
  • Routing concerns (validation) - Dans le DSL de routage, factorisez les sous-routes communes (comments de /posts/1/comments et /videos/1/comments).
  • ActionController::Live (validation) - Diffusez du JSON avec response.stream.
  • ETags déclaratifs (validation) - Ajoutez des ajouts d'ETag au niveau du contrôleur qui feront partie du calcul de l'ETag de l'action.
  • Caching Russian doll (validation) - Mettez en cache des fragments imbriqués de vues. Chaque fragment expire en fonction d'un ensemble de dépendances (une clé de cache). La clé de cache est généralement un numéro de version de modèle de template et un objet modèle.
  • Turbolinks (validation) - Ne servez qu'une seule page HTML initiale. Lorsque l'utilisateur navigue vers une autre page, utilisez pushState pour mettre à jour l'URL et utilisez AJAX pour mettre à jour le titre et le corps.
  • Découpler ActionView de ActionController (validation) - ActionView a été découplé de ActionPack et sera déplacé dans un gem séparé dans Rails 4.1.
  • Ne pas dépendre d'ActiveModel (validation) - ActionPack ne dépend plus d'ActiveModel.

    Général

    • ActiveModel::Model (commit) - ActiveModel::Model, un mixin pour rendre les objets Ruby normaux compatibles avec ActionPack (par exemple pour form_for).
    • Nouvelle API de portée (commit) - Les portées doivent toujours utiliser des fonctions appelables.
    • Dump du cache du schéma (commit) - Pour améliorer le temps de démarrage de Rails, au lieu de charger le schéma directement depuis la base de données, chargez le schéma à partir d'un fichier de dump.
    • Prise en charge de la spécification du niveau d'isolation de la transaction (commit) - Choisissez si la lecture répétable ou les performances améliorées (moins de verrouillage) sont plus importantes.
    • Dalli (commit) - Utilisez le client Dalli memcache pour le magasin memcache.
    • Notifications de début et de fin (commit) - L'instrumentation Active Support signale les notifications de début et de fin aux abonnés.
    • Thread safe par défaut (commit) - Rails peut s'exécuter dans des serveurs d'applications threadés sans configuration supplémentaire.

NOTE : Vérifiez que les gems que vous utilisez sont thread-safe.

  • Verbe PATCH (commit) - Dans Rails, PATCH remplace PUT. PATCH est utilisé pour les mises à jour partielles des ressources.

3.3 Sécurité

  • match ne capture pas tout (commit) - Dans le DSL de routage, match nécessite que le verbe HTTP ou les verbes soient spécifiés.
  • échappement des entités HTML par défaut (commit) - Les chaînes rendues dans erb sont échappées sauf si elles sont enveloppées dans raw ou si html_safe est appelé.
  • Nouveaux en-têtes de sécurité (commit) - Rails envoie les en-têtes suivants avec chaque requête HTTP : X-Frame-Options (empêche le clickjacking en interdisant au navigateur d'intégrer la page dans une frame), X-XSS-Protection (demande au navigateur d'arrêter l'injection de script) et X-Content-Type-Options (empêche le navigateur d'ouvrir un jpeg en tant qu'exécutable).

4 Extraction des fonctionnalités en gems

Dans Rails 4.0, plusieurs fonctionnalités ont été extraites en gems. Vous pouvez simplement ajouter les gems extraites à votre Gemfile pour rétablir la fonctionnalité.

5 Documentation

  • Les guides sont réécrits en Markdown GitHub Flavored.

  • Les guides ont un design responsive.

6 Railties

Veuillez vous référer au Changelog pour des changements détaillés.

6.1 Changements notables

  • Nouveaux emplacements de tests test/models, test/helpers, test/controllers et test/mailers. Les tâches rake correspondantes ont également été ajoutées. (Pull Request)

  • Les exécutables de votre application se trouvent désormais dans le répertoire bin/. Exécutez rake rails:update:bin pour obtenir bin/bundle, bin/rails et bin/rake.

  • Threadsafe activé par défaut

  • La possibilité d'utiliser un constructeur personnalisé en passant --builder (ou -b) à rails new a été supprimée. Considérez plutôt l'utilisation de modèles d'application. (Pull Request)

6.2 Dépréciations

  • config.threadsafe! est déprécié au profit de config.eager_load qui offre un contrôle plus précis sur ce qui est chargé en avance.

  • Rails::Plugin a disparu. Au lieu d'ajouter des plugins à vendor/plugins, utilisez des gems ou bundler avec des dépendances de chemin ou de git.

7 Action Mailer

Veuillez vous référer au Changelog pour des changements détaillés.

7.1 Changements notables

7.2 Dépréciations

8 Active Model

Veuillez vous référer au Changelog pour des changements détaillés.

8.1 Changements notables

  • Ajout de ActiveModel::ForbiddenAttributesProtection, un module simple pour protéger les attributs contre l'assignation de masse lorsque des attributs non autorisés sont passés.

  • Ajout de ActiveModel::Model, un mixin permettant aux objets Ruby de fonctionner avec Action Pack dès le départ.

8.2 Dépréciations

9 Active Support

Veuillez vous référer au journal des modifications pour des changements détaillés.

9.1 Changements notables

  • Remplacement de la gemme memcache-client obsolète par dalli dans ActiveSupport::Cache::MemCacheStore.

  • Optimisation de ActiveSupport::Cache::Entry pour réduire la consommation de mémoire et les frais de traitement.

  • Les inflections peuvent maintenant être définies par locale. singularize et pluralize acceptent la locale en argument supplémentaire.

  • Object#try renverra désormais nil au lieu de lever une erreur NoMethodError si l'objet récepteur n'implémente pas la méthode, mais vous pouvez toujours obtenir l'ancien comportement en utilisant le nouveau Object#try!.

  • String#to_date lève maintenant ArgumentError: invalid date au lieu de NoMethodError: undefined method 'div' for nil:NilClass lorsqu'une date invalide est donnée. C'est maintenant identique à Date.parse, et il accepte plus de dates invalides que dans la version 3.x, par exemple :

    # ActiveSupport 3.x
    "asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass
    "333".to_date # => NoMethodError: undefined method `div' for nil:NilClass
    
    # ActiveSupport 4
    "asdf".to_date # => ArgumentError: invalid date
    "333".to_date # => Fri, 29 Nov 2013
    

9.2 Dépréciations

  • Dépréciation de la méthode ActiveSupport::TestCase#pending, utilisez skip de minitest à la place.

  • ActiveSupport::Benchmarkable#silence a été déprécié en raison de son manque de sécurité au niveau des threads. Il sera supprimé sans remplacement dans Rails 4.1.

  • ActiveSupport::JSON::Variable est déprécié. Définissez vos propres méthodes #as_json et #encode_json pour les littéraux de chaîne JSON personnalisés.

  • Déprécation de la méthode de compatibilité Module#local_constant_names, utilisez Module#local_constants à la place (qui renvoie des symboles).

  • ActiveSupport::BufferedLogger est déprécié. Utilisez ActiveSupport::Logger, ou le logger de la bibliothèque standard Ruby.

  • Dépréciation de assert_present et assert_blank au profit de assert object.blank? et assert object.present?

10 Action Pack

Veuillez vous référer au journal des modifications pour des changements détaillés.

10.1 Changements notables

  • Modification de la feuille de style des pages d'exception en mode développement. Affichage également de la ligne de code et du fragment qui ont provoqué l'exception dans toutes les pages d'exception.

10.2 Dépréciations

11 Active Record

Veuillez vous référer au journal des modifications pour des changements détaillés.

11.1 Changements notables

  • Amélioration des façons d'écrire les migrations change, rendant les anciennes méthodes up et down inutiles.

    • Les méthodes drop_table et remove_column sont désormais réversibles, à condition que les informations nécessaires soient fournies. La méthode remove_column acceptait auparavant plusieurs noms de colonnes ; utilisez plutôt remove_columns (qui n'est pas réversible). La méthode change_table est également réversible, à condition que son bloc n'appelle pas remove, change ou change_default.
    • La nouvelle méthode reversible permet de spécifier du code à exécuter lors de la migration vers le haut ou vers le bas. Voir le Guide sur les migrations
    • La nouvelle méthode revert permet de revenir en arrière sur une migration entière ou sur le bloc donné. Si la migration est effectuée vers le bas, la migration / le bloc donné est exécuté normalement. Voir le Guide sur les migrations
  • Ajout de la prise en charge du type de tableau PostgreSQL. N'importe quel type de données peut être utilisé pour créer une colonne de tableau, avec une prise en charge complète des migrations et du générateur de schéma.

  • Ajout de Relation#load pour charger explicitement l'enregistrement et renvoyer self.

  • Model.all renvoie maintenant une ActiveRecord::Relation, plutôt qu'un tableau d'enregistrements. Utilisez Relation#to_a si vous voulez vraiment un tableau. Dans certains cas spécifiques, cela peut causer des problèmes lors de la mise à niveau.

  • Ajout de ActiveRecord::Migration.check_pending! qui génère une erreur si des migrations sont en attente.

  • Ajout de la prise en charge des codeurs personnalisés pour ActiveRecord::Store. Maintenant, vous pouvez définir votre codeur personnalisé comme ceci :

    store :settings, accessors: [ :color, :homepage ], coder: JSON
    
  • Les connexions mysql et mysql2 définiront SQL_MODE=STRICT_ALL_TABLES par défaut pour éviter toute perte de données silencieuse. Cela peut être désactivé en spécifiant strict: false dans votre database.yml.

  • Suppression de IdentityMap.

  • Suppression de l'exécution automatique des requêtes EXPLAIN. L'option active_record.auto_explain_threshold_in_seconds n'est plus utilisée et doit être supprimée.

  • Ajout de ActiveRecord::NullRelation et ActiveRecord::Relation#none qui implémentent le modèle d'objet nul pour la classe Relation.

  • Ajout de l'aide à la migration create_join_table pour créer des tables de jointure HABTM.

  • Permet la création d'enregistrements hstore PostgreSQL.

11.2 Dépréciations

  • Dépréciation de l'ancienne API de recherche basée sur des hachages. Cela signifie que les méthodes qui acceptaient auparavant des "options de recherche" ne le font plus.

  • Toutes les méthodes dynamiques, à l'exception de find_by_... et find_by_...!, sont dépréciées. Voici comment vous pouvez réécrire le code :

    • find_all_by_... peut être réécrit en utilisant where(...).
    • find_last_by_... peut être réécrit en utilisant where(...).last.
    • scoped_by_... peut être réécrit en utilisant where(...).
    • find_or_initialize_by_... peut être réécrit en utilisant find_or_initialize_by(...).
    • find_or_create_by_... peut être réécrit en utilisant find_or_create_by(...).
    • find_or_create_by_...! peut être réécrit en utilisant find_or_create_by!(...).

12 Crédits

Consultez la liste complète des contributeurs à Rails pour les nombreuses personnes qui ont passé de nombreuses heures à faire de Rails le framework stable et robuste qu'il est. Bravo à tous.

Retour d'information

Vous êtes encouragé à contribuer à l'amélioration de la qualité de ce guide.

Veuillez contribuer si vous trouvez des fautes de frappe ou des erreurs factuelles. Pour commencer, vous pouvez lire notre contribution à la documentation section.

Vous pouvez également trouver du contenu incomplet ou des informations qui ne sont pas à jour. Veuillez ajouter toute documentation manquante pour la version principale. Assurez-vous de vérifier Edge Guides d'abord pour vérifier si les problèmes ont déjà été résolus ou non sur la branche principale. Consultez les Directives des guides Ruby on Rails pour le style et les conventions.

Si pour une raison quelconque vous repérez quelque chose à corriger mais ne pouvez pas le faire vous-même, veuillez ouvrir un problème.

Et enfin, toute discussion concernant la documentation de Ruby on Rails est la bienvenue sur le Forum officiel de Ruby on Rails.