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
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
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
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
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
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
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
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
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
etrails:update:bin
. (commit)Suppression de la variable d'environnement
CONTROLLER
obsolète pour la tâcheroutes
. (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 danscable.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 classesActionDispatch::IntegrationTest
etActionController::TestCase
. (Commit, Commit)Suppression des méthodes dépréciées
ActionDispatch::Callbacks.to_prepare
etActionDispatch::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
dansrender
. (Commit, Commit)Suppression de la prise en charge dépréciée de l'appel des méthodes
HashWithIndifferentAccess
surActionController::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
etresolve
à 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é dansActionView::Template::Error
. (commit)Suppression de l'option
encode_special_chars
mal nommée destrip_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
etdatetime_field_tag
pour générer des champsdatetime-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 deform_tag
etform_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
etactiverecord.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é dansActiveRecord::StatementInvalid#initialize
etActiveRecord::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 deerror_on_ignored_order
. (Commit)Déprécier
sanitize_conditions
au profit desanitize_sql
. (Pull Request)Déprécier
supports_migrations?
sur les adaptateurs de connexion. (Pull Request)Déprécier
Migrator.schema_migrations_table_name
, utiliserSchemaMigration.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 utiliserEnumerable#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 commandepsql
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é dansActiveJob::DeserializationError
. (commit)
11.2 Modifications notables
Ajout de la gestion déclarative des exceptions via
ActiveJob::Base.retry_on
etActiveJob::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 classeActiveSupport::HashWithIndifferentAccess
. (Pull Request)Dépréciation du passage d'une chaîne de caractères aux options conditionnelles
:if
et:unless
deset_callback
etskip_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
etassert_no_changes
pour les tests. (Pull Request)Les méthodes
travel
ettravel_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.