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
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 pourform_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.
- ActiveModel::Model (commit) -
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 sihtml_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) etX-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é.
- Méthodes de recherche basées sur des hachages et dynamiques (GitHub)
- Protection contre l'assignation massive dans les modèles Active Record (GitHub, Pull Request)
- ActiveRecord::SessionStore (GitHub, Pull Request)
- Observateurs Active Record (GitHub, Commit)
- Active Resource (GitHub, Pull Request, Blog)
- Action Caching (GitHub, Pull Request)
- Page Caching (GitHub, Pull Request)
- Sprockets (GitHub)
- Tests de performance (GitHub, Pull Request)
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
ettest/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écutezrake rails:update:bin
pour obtenirbin/bundle
,bin/rails
etbin/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 deconfig.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 pardalli
dansActiveSupport::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
etpluralize
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 nouveauObject#try!
.String#to_date
lève maintenantArgumentError: invalid date
au lieu deNoMethodError: 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
, utilisezskip
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
, utilisezModule#local_constants
à la place (qui renvoie des symboles).ActiveSupport::BufferedLogger
est déprécié. UtilisezActiveSupport::Logger
, ou le logger de la bibliothèque standard Ruby.Dépréciation de
assert_present
etassert_blank
au profit deassert object.blank?
etassert 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éthodesup
etdown
inutiles.- Les méthodes
drop_table
etremove_column
sont désormais réversibles, à condition que les informations nécessaires soient fournies. La méthoderemove_column
acceptait auparavant plusieurs noms de colonnes ; utilisez plutôtremove_columns
(qui n'est pas réversible). La méthodechange_table
est également réversible, à condition que son bloc n'appelle pasremove
,change
ouchange_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
- Les méthodes
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 renvoyerself
.Model.all
renvoie maintenant uneActiveRecord::Relation
, plutôt qu'un tableau d'enregistrements. UtilisezRelation#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
etmysql2
définirontSQL_MODE=STRICT_ALL_TABLES
par défaut pour éviter toute perte de données silencieuse. Cela peut être désactivé en spécifiantstrict: false
dans votredatabase.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
etActiveRecord::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_...
etfind_by_...!
, sont dépréciées. Voici comment vous pouvez réécrire le code :find_all_by_...
peut être réécrit en utilisantwhere(...)
.find_last_by_...
peut être réécrit en utilisantwhere(...).last
.scoped_by_...
peut être réécrit en utilisantwhere(...)
.find_or_initialize_by_...
peut être réécrit en utilisantfind_or_initialize_by(...)
.find_or_create_by_...
peut être réécrit en utilisantfind_or_create_by(...)
.find_or_create_by_...!
peut être réécrit en utilisantfind_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.