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

Notes de version de Ruby on Rails 5.1

Points forts de Rails 5.1 :

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

1 Mise à niveau vers Rails 5.1

Si vous mettez à niveau une application existante, il est conseillé d'avoir une bonne couverture de tests avant de commencer. Vous devriez également d'abord passer à Rails 5.0 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 5.1. Une liste de points à surveiller lors de la mise à niveau est disponible dans le guide Mise à niveau de Ruby on Rails.

2 Fonctionnalités majeures

2.1 Prise en charge de Yarn

Pull Request

Rails 5.1 permet de gérer les dépendances JavaScript via npm via Yarn. Cela facilitera l'utilisation de bibliothèques telles que React, VueJS ou toute autre bibliothèque du monde npm. La prise en charge de Yarn est intégrée au pipeline d'actifs de sorte que toutes les dépendances fonctionneront parfaitement avec l'application Rails 5.1.

2.2 Prise en charge facultative de Webpack

Pull Request

Les applications Rails peuvent s'intégrer plus facilement à Webpack, un assembleur d'actifs JavaScript, en utilisant le nouveau gem Webpacker. Utilisez l'option --webpack lors de la génération de nouvelles applications pour activer l'intégration de Webpack.

Cela est entièrement compatible avec le pipeline d'actifs, que vous pouvez continuer à utiliser pour les images, les polices, les sons et autres actifs. Vous pouvez même avoir du code JavaScript géré par le pipeline d'actifs et un autre code traité via Webpack. Tout cela est géré par Yarn, qui est activé par défaut.

2.3 jQuery n'est plus une dépendance par défaut

Pull Request

jQuery était requis par défaut dans les versions antérieures de Rails pour fournir des fonctionnalités telles que data-remote, data-confirm et d'autres parties de l'offre JavaScript non intrusive de Rails. Il n'est plus requis, car l'UJS a été réécrit pour utiliser du JavaScript simple et vanille. Ce code est maintenant inclus dans Action View en tant que rails-ujs.

Vous pouvez toujours utiliser jQuery si nécessaire, mais il n'est plus requis par défaut.

2.4 Tests système

Pull Request

Rails 5.1 prend en charge intégrée pour l'écriture de tests Capybara, sous la forme de tests système. Vous n'avez plus besoin de vous soucier de la configuration de Capybara et des stratégies de nettoyage de la base de données pour de tels tests. Rails 5.1 fournit un wrapper pour exécuter des tests dans Chrome avec des fonctionnalités supplémentaires telles que des captures d'écran en cas d'échec.

2.5 Secrets chiffrés

Pull Request

Rails permet désormais la gestion des secrets d'application de manière sécurisée, inspirée par le gem sekrets.

Exécutez bin/rails secrets:setup pour configurer un nouveau fichier de secrets chiffrés. Cela générera également une clé maîtresse, qui doit être stockée en dehors du dépôt. Les secrets eux-mêmes peuvent ensuite être enregistrés en toute sécurité dans le système de contrôle de révision, sous une forme chiffrée.

Les secrets seront déchiffrés en production, en utilisant une clé stockée soit dans la variable d'environnement RAILS_MASTER_KEY, soit dans un fichier de clé.

2.6 Mailers paramétrés

Pull Request

Permet de spécifier des paramètres communs utilisés pour toutes les méthodes d'une classe de mailer afin de partager des variables d'instance, des en-têtes et d'autres configurations communes.

class InvitationsMailer < ApplicationMailer
  before_action { @inviter, @invitee = params[:inviter], params[:invitee] }
  before_action { @account = params[:inviter].account }

  def account_invitation
    mail subject: "#{@inviter.name} vous a invité à leur Basecamp (#{@account.name})"
  end
end
InvitationsMailer.with(inviter: person_a, invitee: person_b)
                 .account_invitation.deliver_later

2.7 Routes directes et résolues

Pull Request

Rails 5.1 ajoute deux nouvelles méthodes, resolve et direct, à la DSL de routage. La méthode resolve permet de personnaliser la correspondance polymorphique des modèles. ```ruby resource :panier

resolve("Panier") { [:panier] } ```

<%= form_for @panier do |form| %>
  <!-- formulaire du panier -->
<% end %>

Cela générera l'URL singulière /panier au lieu de l'habituel /paniers/:id.

La méthode direct permet de créer des URL helpers personnalisés.

direct(:page_d_accueil) { "https://rubyonrails.org" }

page_d_accueil_url # => "https://rubyonrails.org"

La valeur de retour du bloc doit être un argument valide pour la méthode url_for. Vous pouvez donc passer une URL sous forme de chaîne valide, un Hash, un Array, une instance Active Model ou une classe Active Model.

direct :commentable do |model|
  [ model, anchor: model.dom_id ]
end

direct :principal do
  { controller: 'pages', action: 'index', subdomain: 'www' }
end

2.8 Unification de form_for et form_tag en form_with

Pull Request

Avant Rails 5.1, il y avait deux interfaces pour gérer les formulaires HTML : form_for pour les instances de modèle et form_tag pour les URLs personnalisées.

Rails 5.1 combine ces deux interfaces avec form_with, et peut générer des balises de formulaire basées sur des URLs, des scopes ou des modèles.

En utilisant simplement une URL :

<%= form_with url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Générera %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="title">
</form>

L'ajout d'un scope préfixe les noms des champs d'entrée :

<%= form_with scope: :post, url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Générera %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="post[title]">
</form>

L'utilisation d'un modèle déduit à la fois l'URL et le scope :

<%= form_with model: Post.new do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Générera %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="post[title]">
</form>

Un modèle existant crée un formulaire de mise à jour et remplit les valeurs des champs :

<%= form_with model: Post.first do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# Générera %>

<form action="/posts/1" method="post" data-remote="true">
  <input type="hidden" name="_method" value="patch">
  <input type="text" name="post[title]" value="<le titre du post>">
</form>

3 Incompatibilités

Les changements suivants peuvent nécessiter une action immédiate lors de la mise à niveau.

3.1 Tests transactionnels avec plusieurs connexions

Les tests transactionnels enveloppent désormais toutes les connexions Active Record dans des transactions de base de données.

Lorsqu'un test génère des threads supplémentaires et que ces threads obtiennent des connexions de base de données, ces connexions sont désormais gérées de manière spéciale :

Les threads partageront une seule connexion, qui se trouve à l'intérieur de la transaction gérée. Cela garantit que tous les threads voient la base de données dans le même état, en ignorant la transaction la plus externe. Auparavant, de telles connexions supplémentaires ne pouvaient pas voir les lignes de données de test, par exemple.

Lorsqu'un thread entre dans une transaction imbriquée, il obtiendra temporairement l'utilisation exclusive de la connexion pour maintenir l'isolation.

Si vos tests dépendent actuellement de l'obtention d'une connexion séparée en dehors de la transaction dans un thread généré, vous devrez passer à une gestion de connexion plus explicite.

Si vos tests génèrent des threads et que ces threads interagissent tout en utilisant également des transactions de base de données explicites, ce changement peut entraîner un blocage.

La manière la plus simple de désactiver ce nouveau comportement est de désactiver les tests transactionnels sur tous les cas de test concernés.

4 Railties

Veuillez vous référer au [journal des modifications][railties] pour des détails sur les changements.

4.1 Suppressions

  • Suppression de config.static_cache_control obsolète. (commit)

  • Suppression de config.serve_static_files obsolète. (commit)

  • Suppression du fichier obsolète rails/rack/debugger. (commit)

  • Suppression des tâches obsolètes : rails:update, rails:template, rails:template:copy, rails:update:configs et rails:update:bin. (commit)

  • Suppression de la variable d'environnement CONTROLLER obsolète pour la tâche routes. (commit)

  • Suppression de l'option -j (--javascript) de la commande rails new. (Pull Request)

4.2 Changements notables

  • Ajout d'une section partagée à config/secrets.yml qui sera chargée pour tous les environnements. (commit)

  • Le fichier de configuration config/secrets.yml est maintenant chargé avec toutes les clés en tant que symboles. (Pull Request)

  • Suppression de jquery-rails de la pile par défaut. rails-ujs, qui est inclus avec Action View, est utilisé comme adaptateur UJS par défaut. (Pull Request)

  • Ajout de la prise en charge de Yarn dans les nouvelles applications avec un binstub Yarn et un package.json. (Pull Request)

  • Ajouter la prise en charge de Webpack dans les nouvelles applications via l'option --webpack, qui déléguera au gem rails/webpacker. (Pull Request)

  • Initialiser le dépôt Git lors de la génération d'une nouvelle application, si l'option --skip-git n'est pas fournie. (Pull Request)

  • Ajouter des secrets chiffrés dans config/secrets.yml.enc. (Pull Request)

  • Afficher le nom de la classe Railtie dans les initialisateurs de Rails. (Pull Request)

5 Action Cable

Veuillez vous référer au [journal des modifications][action-cable] pour des changements détaillés.

5.1 Changements notables

  • Ajout de la prise en charge de channel_prefix aux adaptateurs Redis et Redis evented dans cable.yml pour éviter les collisions de noms lors de l'utilisation du même serveur Redis avec plusieurs applications. (Pull Request)

  • Ajout du crochet ActiveSupport::Notifications pour diffuser des données. (Pull Request)

6 Action Pack

Veuillez vous référer au [journal des modifications][action-pack] pour des changements détaillés.

6.1 Suppressions

  • Suppression de la prise en charge des arguments non clés dans #process, #get, #post, #patch, #put, #delete et #head pour les classes ActionDispatch::IntegrationTest et ActionController::TestCase. (Commit, Commit)

  • Suppression des méthodes dépréciées ActionDispatch::Callbacks.to_prepare et ActionDispatch::Callbacks.to_cleanup. (Commit)

  • Suppression des méthodes dépréciées liées aux filtres de contrôleur. (Commit)

  • Suppression de la prise en charge dépréciée de :text et :nothing dans render. (Commit, Commit)

  • Suppression de la prise en charge dépréciée de l'appel des méthodes HashWithIndifferentAccess sur ActionController::Parameters. (Commit)

6.2 Dépréciations

  • Dépréciation de config.action_controller.raise_on_unfiltered_parameters. Cela n'a aucun effet dans Rails 5.1. (Commit)

6.3 Changements notables

  • Ajout des méthodes direct et resolve à la DSL de routage. (Pull Request)

  • Ajout d'une nouvelle classe ActionDispatch::SystemTestCase pour écrire des tests système dans vos applications. (Pull Request)

7 Action View

Veuillez vous référer au [journal des modifications][action-view] pour des changements détaillés.

7.1 Suppressions

  • Suppression de #original_exception déprécié dans ActionView::Template::Error. (commit)

  • Suppression de l'option encode_special_chars mal nommée de strip_tags. (Pull Request)

7.2 Dépréciations

  • Dépréciation du gestionnaire ERB Erubis au profit de Erubi. (Pull Request)

7.3 Changements notables

  • Le gestionnaire de modèles bruts (le gestionnaire de modèles par défaut dans Rails 5) génère maintenant des chaînes HTML sécurisées. (commit)

  • Modification de datetime_field et datetime_field_tag pour générer des champs datetime-local. (Pull Request)

  • Nouvelle syntaxe de style Builder pour les balises HTML (tag.div, tag.br, etc.). (Pull Request)

  • Ajouter form_with pour unifier l'utilisation de form_tag et form_for. (Pull Request)

  • Ajouter l'option check_parameters à current_page?. (Pull Request)

8 Action Mailer

Veuillez vous référer au [Changelog][action-mailer] pour des changements détaillés.

8.1 Changements notables

  • Autoriser le réglage du type de contenu personnalisé lorsque des pièces jointes sont incluses et que le corps est défini en ligne. (Pull Request)

  • Autoriser le passage de lambdas en tant que valeurs à la méthode default. (Commit)

  • Ajouter la prise en charge de l'invocation paramétrée des mailers pour partager les filtres et les valeurs par défaut entre différentes actions de mailer. (Commit)

  • Transmettre les arguments entrants à l'action du mailer à l'événement process.action_mailer sous une clé args. (Pull Request)

9 Active Record

Veuillez vous référer au [Changelog][active-record] pour des changements détaillés.

9.1 Suppressions

  • Supprimer la prise en charge du passage d'arguments et de bloc en même temps à ActiveRecord::QueryMethods#select. (Commit)

  • Supprimer les plages i18n dépréciées activerecord.errors.messages.restrict_dependent_destroy.one et activerecord.errors.messages.restrict_dependent_destroy.many. (Commit)

  • Supprimer l'argument de rechargement forcé déprécié dans les lecteurs d'association singuliers et de collection. (Commit)

  • Supprimer la prise en charge dépréciée du passage d'une colonne à #quote. (Commit)

  • Supprimer les arguments name dépréciés de #tables. (Commit)

  • Supprimer le comportement déprécié de #tables et #table_exists? pour renvoyer uniquement des tables et non des vues. (Commit)

  • Supprimer l'argument original_exception déprécié dans ActiveRecord::StatementInvalid#initialize et ActiveRecord::StatementInvalid#original_exception. (Commit)

  • Supprimer la prise en charge dépréciée du passage d'une classe en tant que valeur dans une requête. (Commit)

  • Supprimer la prise en charge dépréciée de la requête en utilisant des virgules sur LIMIT. (Commit)

  • Supprimer le paramètre conditions déprécié de #destroy_all. (Commit)

  • Supprimer le paramètre conditions déprécié de #delete_all. (Commit)

  • Supprimer la méthode dépréciée #load_schema_for au profit de #load_schema. (Commit)

  • Supprimer la configuration dépréciée #raise_in_transactional_callbacks. (Commit)

  • Supprimer la configuration dépréciée #use_transactional_fixtures. (Commit)

9.2 Dépréciations

  • Déprécier le drapeau error_on_ignored_order_or_limit au profit de error_on_ignored_order. (Commit)

  • Déprécier sanitize_conditions au profit de sanitize_sql. (Pull Request)

  • Déprécier supports_migrations? sur les adaptateurs de connexion. (Pull Request)

  • Déprécier Migrator.schema_migrations_table_name, utiliser SchemaMigration.table_name à la place. (Pull Request)

  • Déprécier l'utilisation de #quoted_id dans la citation et la conversion de type. (Pull Request)

  • Dépréciation de l'argument default passé à #index_name_exists?. (Pull Request)

9.3 Modifications notables

  • Changement des clés primaires par défaut en BIGINT. (Pull Request)

  • Prise en charge des colonnes virtuelles/générées pour MySQL 5.7.5+ et MariaDB 5.2.0+. (Commit)

  • Ajout de la prise en charge des limites dans le traitement par lots. (Commit)

  • Les tests transactionnels enveloppent maintenant toutes les connexions Active Record dans des transactions de base de données. (Pull Request)

  • Les commentaires sont désormais ignorés dans la sortie de la commande mysqldump par défaut. (Pull Request)

  • Correction de ActiveRecord::Relation#count pour utiliser Enumerable#count de Ruby pour compter les enregistrements lorsqu'un bloc est passé en argument au lieu de l'ignorer silencieusement. (Pull Request)

  • Passage du drapeau "-v ON_ERROR_STOP=1" avec la commande psql pour ne pas supprimer les erreurs SQL. (Pull Request)

  • Ajout de ActiveRecord::Base.connection_pool.stat. (Pull Request)

  • L'héritage direct de ActiveRecord::Migration génère une erreur. Spécifiez la version de Rails pour laquelle la migration a été écrite. (Commit)

  • Une erreur est générée lorsque l'association through a un nom de réflexion ambigu. (Commit)

10 Active Model

Veuillez vous référer au [journal des modifications][active-model] pour plus de détails sur les changements.

10.1 Suppressions

  • Suppression des méthodes dépréciées dans ActiveModel::Errors. (commit)

  • Suppression de l'option dépréciée :tokenizer dans le validateur de longueur. (commit)

  • Suppression du comportement déprécié qui arrête les rappels lorsque la valeur de retour est fausse. (commit)

10.2 Modifications notables

  • La chaîne originale attribuée à un attribut de modèle n'est plus incorrectement gelée. (Pull Request)

11 Active Job

Veuillez vous référer au [journal des modifications][active-job] pour plus de détails sur les changements.

11.1 Suppressions

  • Suppression du support déprécié pour passer la classe d'adaptateur à .queue_adapter. (commit)

  • Suppression de #original_exception déprécié dans ActiveJob::DeserializationError. (commit)

11.2 Modifications notables

  • Ajout de la gestion déclarative des exceptions via ActiveJob::Base.retry_on et ActiveJob::Base.discard_on. (Pull Request)

  • Renvoie l'instance de travail pour avoir accès à des éléments tels que job.arguments dans la logique personnalisée après l'échec des nouvelles tentatives. (commit)

12 Active Support

Veuillez vous référer au journal des modifications pour plus de détails sur les changements.

12.1 Suppressions

  • Suppression de la classe ActiveSupport::Concurrency::Latch. (Commit)

  • Suppression de halt_callback_chains_on_return_false. (Commit)

  • Suppression du comportement déprécié qui arrête les rappels lorsque la valeur de retour est fausse. (Commit)

    Dépréciations

  • La classe HashWithIndifferentAccess de niveau supérieur a été dépréciée en douceur en faveur de la classe ActiveSupport::HashWithIndifferentAccess. (Pull Request)

  • Dépréciation du passage d'une chaîne de caractères aux options conditionnelles :if et :unless de set_callback et skip_callback. (Commit)

12.2 Changements notables

  • Correction de l'analyse de la durée et du déplacement pour le rendre cohérent lors des changements d'heure d'été. (Commit, Pull Request)

  • Mise à jour d'Unicode vers la version 9.0.0. (Pull Request)

  • Ajout des alias Duration#before et #after pour #ago et #since. (Pull Request)

  • Ajout de Module#delegate_missing_to pour déléguer les appels de méthodes non définies pour l'objet courant à un objet proxy. (Pull Request)

  • Ajout de Date#all_day qui renvoie une plage représentant toute la journée de la date et de l'heure actuelles. (Pull Request)

  • Introduction des méthodes assert_changes et assert_no_changes pour les tests. (Pull Request)

  • Les méthodes travel et travel_to lèvent maintenant une exception lors d'appels imbriqués. (Pull Request)

  • Mise à jour de DateTime#change pour prendre en charge les microsecondes et les nanosecondes. (Pull Request)

13 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.