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

Ruby on Rails 4.1 Notes de version

Points forts de Rails 4.1 :

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

1 Mise à niveau vers Rails 4.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 4.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 4.1. Une liste de choses à surveiller lors de la mise à niveau est disponible dans le guide Mise à niveau de Ruby on Rails.

2 Fonctionnalités majeures

2.1 Préchargeur d'application Spring

Spring est un préchargeur d'application Rails. Il accélère le développement en maintenant votre application en cours d'exécution en arrière-plan, de sorte que vous n'avez pas besoin de la démarrer à chaque fois que vous exécutez un test, une tâche rake ou une migration.

Les nouvelles applications Rails 4.1 seront livrées avec des binstubs "springifiés". Cela signifie que bin/rails et bin/rake profiteront automatiquement des environnements spring préchargés.

Exécution des tâches rake :

$ bin/rake test:models

Exécution d'une commande Rails :

$ bin/rails console

Inspection de Spring :

$ bin/spring status
Spring est en cours d'exécution :

 1182 spring server | my_app | démarré il y a 29 minutes
 3656 spring app    | my_app | démarré il y a 23 secondes | mode test
 3746 spring app    | my_app | démarré il y a 10 secondes | mode développement

Consultez le README de Spring pour voir toutes les fonctionnalités disponibles.

Consultez le guide Mise à niveau de Ruby on Rails pour savoir comment migrer les applications existantes pour utiliser cette fonctionnalité.

2.2 config/secrets.yml

Rails 4.1 génère un nouveau fichier secrets.yml dans le dossier config. Par défaut, ce fichier contient la secret_key_base de l'application, mais il peut également être utilisé pour stocker d'autres secrets tels que des clés d'accès pour des API externes.

Les secrets ajoutés à ce fichier sont accessibles via Rails.application.secrets. Par exemple, avec le config/secrets.yml suivant :

development:
  secret_key_base: 3b7cd727ee24e8444053437c36cc66c3
  some_api_key: SOMEKEY

Rails.application.secrets.some_api_key renvoie SOMEKEY dans l'environnement de développement.

Consultez le guide Mise à niveau de Ruby on Rails pour savoir comment migrer les applications existantes pour utiliser cette fonctionnalité.

2.3 Variants d'Action Pack

Nous voulons souvent rendre différents modèles HTML/JSON/XML pour les téléphones, les tablettes et les navigateurs de bureau. Les variants facilitent cela.

Le variant de la requête est une spécialisation du format de la requête, comme :tablet, :phone ou :desktop.

Vous pouvez définir le variant dans un before_action :

request.variant = :tablet if request.user_agent =~ /iPad/

Répondez aux variants dans l'action de la même manière que vous répondez aux formats :

respond_to do |format|
  format.html do |html|
    html.tablet # rend app/views/projects/show.html+tablet.erb
    html.phone { extra_setup; render ... }
  end
end

Fournissez des modèles distincts pour chaque format et variant :

app/views/projects/show.html.erb
app/views/projects/show.html+tablet.erb
app/views/projects/show.html+phone.erb

Vous pouvez également simplifier la définition des variants en utilisant la syntaxe en ligne :

respond_to do |format|
  format.js         { render "trash" }
  format.html.phone { redirect_to progress_path }
  format.html.none  { render "trash" }
end

2.4 Prévisualisations d'Action Mailer

Les prévisualisations d'Action Mailer permettent de voir à quoi ressemblent les e-mails en visitant une URL spéciale qui les affiche.

Vous implémentez une classe de prévisualisation dont les méthodes renvoient l'objet de courrier que vous souhaitez vérifier :

class NotifierPreview < ActionMailer::Preview
  def welcome
    Notifier.welcome(User.first)
  end
end

La prévisualisation est disponible à l'adresse http://localhost:3000/rails/mailers/notifier/welcome, et une liste d'entre elles à l'adresse http://localhost:3000/rails/mailers.

Par défaut, ces classes de prévisualisation se trouvent dans test/mailers/previews. Cela peut être configuré à l'aide de l'option preview_path.

Consultez sa documentation pour plus de détails.

2.5 Énumérations Active Record

Déclarez un attribut énuméré dont les valeurs sont mappées sur des entiers dans la base de données, mais peuvent être interrogées par nom.

class Conversation < ActiveRecord::Base
  enum status: [ :active, :archived ]
end

conversation.archived!
conversation.active? # => false
conversation.status  # => "archived"

Conversation.archived # => Relation pour toutes les conversations archivées

Conversation.statuses # => { "active" => 0, "archived" => 1 }

Consultez sa documentation pour plus de détails.

2.6 Vérificateurs de messages

Les vérificateurs de messages peuvent être utilisés pour générer et vérifier des messages signés. Cela peut être utile pour transporter en toute sécurité des données sensibles telles que des jetons de rappel et des amis.

La méthode Rails.application.message_verifier renvoie un nouveau vérificateur de messages qui signe les messages avec une clé dérivée de secret_key_base et du nom du vérificateur de messages donné :

signed_token = Rails.application.message_verifier(:remember_me).generate(token)
Rails.application.message_verifier(:remember_me).verify(signed_token) # => token

Rails.application.message_verifier(:remember_me).verify(tampered_token)
# lève une exception ActiveSupport::MessageVerifier::InvalidSignature

2.7 Module#concerning

Une façon naturelle et peu cérémonieuse de séparer les responsabilités au sein d'une classe :

class Todo < ActiveRecord::Base
  concerning :EventTracking do
    included do
      has_many :events
    end

    def latest_event
      # ...
    end

    private
      def some_internal_method
        # ...
      end
  end
end

Cet exemple est équivalent à la définition d'un module EventTracking en ligne, en l'étendant avec ActiveSupport::Concern, puis en le mélangeant à la classe Todo.

Consultez sa documentation pour plus de détails et les cas d'utilisation prévus.

2.8 Protection CSRF contre les balises <script> distantes

La protection contre les attaques de falsification de requête intersite (CSRF) couvre désormais également les requêtes GET avec des réponses JavaScript. Cela empêche un site tiers de référencer votre URL JavaScript et de tenter de l'exécuter pour extraire des données sensibles.

Cela signifie que tous vos tests qui accèdent aux URL .js échoueront désormais à la protection CSRF, sauf s'ils utilisent xhr. Mettez à jour vos tests pour être explicites quant à l'attente de XmlHttpRequests. Au lieu de post :create, format: :js, passez à l'explicite xhr :post, :create, format: :js.

3 Railties

Veuillez vous référer au journal des modifications pour obtenir des détails sur les modifications apportées.

3.1 Suppressions

  • Suppression de la tâche rake update:application_controller.

  • Suppression de Rails.application.railties.engines obsolète.

  • Suppression de threadsafe! obsolète de Rails Config.

  • Suppression de ActiveRecord::Generators::ActiveModel#update_attributes obsolète au profit de ActiveRecord::Generators::ActiveModel#update.

  • Suppression de l'option config.whiny_nils obsolète.

  • Suppression des tâches rake obsolètes pour l'exécution des tests : rake test:uncommitted et rake test:recent.

3.2 Changements notables

  • Le préchargeur d'application Spring est maintenant installé par défaut pour les nouvelles applications. Il utilise le groupe de développement du Gemfile, il ne sera donc pas installé en production. (Demande de tirage)

  • Variable d'environnement BACKTRACE pour afficher des traces complètes des erreurs de test. (Commit)

  • Exposition de MiddlewareStack#unshift à la configuration de l'environnement. (Demande de tirage)

  • Ajout de la méthode Application#message_verifier pour renvoyer un vérificateur de messages. (Demande de tirage)

  • Le fichier test_help.rb, requis par l'aide de test générée par défaut, met automatiquement à jour votre base de données de test avec db/schema.rb (ou db/structure.sql). Il génère une erreur si le rechargement du schéma ne résout pas toutes les migrations en attente. Désactivez cette fonctionnalité avec config.active_record.maintain_test_schema = false. (Demande de tirage)

  • Introduire Rails.gem_version comme une méthode pratique pour retourner Gem::Version.new(Rails.version), suggérant une façon plus fiable de comparer les versions. (Pull Request)

4 Action Pack

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

4.1 Suppressions

  • Suppression de la rétrocompatibilité de l'application Rails pour les tests d'intégration, définissez ActionDispatch.test_app à la place.

  • Suppression de la configuration dépréciée page_cache_extension.

  • Suppression de la constante dépréciée ActionController::RecordIdentifier, utilisez ActionView::RecordIdentifier à la place.

  • Suppression des constantes dépréciées d'Action Controller :

Supprimée Successeur
ActionController::AbstractRequest ActionDispatch::Request
ActionController::Request ActionDispatch::Request
ActionController::AbstractResponse ActionDispatch::Response
ActionController::Response ActionDispatch::Response
ActionController::Routing ActionDispatch::Routing
ActionController::Integration ActionDispatch::Integration
ActionController::IntegrationTest ActionDispatch::IntegrationTest

4.2 Changements notables

  • protect_from_forgery empêche également les balises <script> en provenance de domaines différents. Mettez à jour vos tests en utilisant xhr :get, :foo, format: :js au lieu de get :foo, format: :js. (Pull Request)

  • #url_for prend un hash avec des options à l'intérieur d'un tableau. (Pull Request)

  • Ajout de la méthode session#fetch qui fonctionne de manière similaire à Hash#fetch, à l'exception que la valeur retournée est toujours enregistrée dans la session. (Pull Request)

  • Séparation complète de Action View de Action Pack. (Pull Request)

  • Journalisation des clés affectées par deep munge. (Pull Request)

  • Nouvelle option de configuration config.action_dispatch.perform_deep_munge pour désactiver le "deep munging" des paramètres qui était utilisé pour résoudre la vulnérabilité de sécurité CVE-2013-0155. (Pull Request)

  • Nouvelle option de configuration config.action_dispatch.cookies_serializer pour spécifier un sérialiseur pour les jars de cookies signés et chiffrés. (Pull Requests 1, 2 / Plus de détails)

  • Ajout des options render :plain, render :html et render :body. (Pull Request / Plus de détails)

5 Action Mailer

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

5.1 Changements notables

  • Ajout de la fonctionnalité de prévisualisation des mailers basée sur le gem mail_view de 37 Signals. (Commit)

  • Instrumentation de la génération des messages Action Mailer. Le temps nécessaire pour générer un message est écrit dans le journal. (Pull Request)

6 Active Record

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

6.1 Suppressions

  • Suppression de la possibilité de passer nil aux méthodes suivantes de SchemaCache : primary_keys, tables, columns et columns_hash.

  • Suppression du filtre de bloc déprécié de ActiveRecord::Migrator#migrate.

  • Suppression du constructeur de chaîne déprécié de ActiveRecord::Migrator.

  • Suppression de l'utilisation dépréciée de scope sans passer un objet callable.

  • Suppression de transaction_joinable= déprécié au profit de begin_transaction avec l'option :joinable.

  • Suppression de decrement_open_transactions déprécié.

  • Suppression de increment_open_transactions déprécié.

  • Suppression de la méthode PostgreSQLAdapter#outside_transaction? dépréciée. Vous pouvez utiliser #transaction_open? à la place.

  • Suppression de ActiveRecord::Fixtures.find_table_name dépréciée au profit de ActiveRecord::Fixtures.default_fixture_model_name.

  • Suppression de columns_for_remove dépréciée de SchemaStatements.

  • Suppression de SchemaStatements#distinct dépréciée.

  • Déplacement de ActiveRecord::TestCase dépréciée dans la suite de tests de Rails. La classe n'est plus publique et est utilisée uniquement pour les tests internes de Rails.

  • Suppression du support de l'option dépréciée :restrict pour :dependent dans les associations.

  • Suppression du support des options :delete_sql, :insert_sql, :finder_sql et :counter_sql dépréciées dans les associations.

  • Suppression de la méthode type_cast_code dépréciée de Column.

  • Suppression de la méthode ActiveRecord::Base#connection dépréciée. Assurez-vous d'y accéder via la classe.

  • Suppression de l'avertissement de dépréciation pour auto_explain_threshold_in_seconds.

  • Suppression de l'option dépréciée :distinct de Relation#count.

  • Suppression des méthodes dépréciées partial_updates, partial_updates? et partial_updates=.

  • Suppression de la méthode dépréciée scoped.

  • Suppression de la méthode dépréciée default_scopes?.

  • Suppression des références de jointure implicites qui étaient dépréciées dans la version 4.0.

  • Suppression de activerecord-deprecated_finders en tant que dépendance. Veuillez consulter le README de la gem pour plus d'informations.

  • Suppression de l'utilisation de implicit_readonly. Veuillez utiliser la méthode readonly explicitement pour marquer les enregistrements comme readonly. (Pull Request)

6.2 Dépréciations

  • Méthode quoted_locking_column dépréciée, qui n'est utilisée nulle part.

  • Méthode ConnectionAdapters::SchemaStatements#distinct dépréciée, car elle n'est plus utilisée en interne. (Pull Request)

  • Tâches rake db:test:* dépréciées car la base de données de test est maintenant automatiquement gérée. Voir les notes de version de Railties. (Pull Request)

  • Dépréciation des méthodes inutilisées ActiveRecord::Base.symbolized_base_class et ActiveRecord::Base.symbolized_sti_name sans remplacement. Commit

6.3 Changements notables

  • Les scopes par défaut ne sont plus remplacés par des conditions chaînées.

Avant cette modification, lorsque vous définissiez un default_scope dans un modèle, il était remplacé par des conditions chaînées dans le même champ. Maintenant, il est fusionné comme n'importe quel autre scope. Plus de détails.

  • Ajout de ActiveRecord::Base.to_param pour des URL "jolies" dérivées d'un attribut ou d'une méthode d'un modèle. (Pull Request)

  • Ajout de ActiveRecord::Base.no_touching, qui permet d'ignorer le toucher sur les modèles. (Pull Request)

  • Unification de la conversion de type booléen pour MysqlAdapter et Mysql2Adapter. type_cast renverra 1 pour true et 0 pour false. (Pull Request)

  • .unscope supprime maintenant les conditions spécifiées dans default_scope. (Commit)

  • Ajout de ActiveRecord::QueryMethods#rewhere qui écrira par-dessus une condition where existante et nommée. (Commit)

  • Extension de ActiveRecord::Base#cache_key pour prendre une liste facultative d'attributs de timestamp dont le plus élevé sera utilisé. (Commit)

  • Ajout de ActiveRecord::Base#enum pour déclarer des attributs énumérés dont les valeurs sont mappées sur des entiers dans la base de données, mais peuvent être interrogées par nom. (Commit)

  • Conversion des valeurs JSON lors de l'écriture, de sorte que la valeur soit cohérente avec la lecture depuis la base de données. (Pull Request)

  • Conversion des valeurs hstore lors de l'écriture, de sorte que la valeur soit cohérente avec la lecture depuis la base de données. (Commit)

  • Rendre next_migration_number accessible aux générateurs tiers. (Pull Request)

  • L'appel à update_attributes lèvera désormais une ArgumentError chaque fois qu'il reçoit un argument nil. Plus précisément, une erreur sera levée si l'argument passé ne répond pas à stringify_keys. (Pull Request)

  • CollectionAssociation#first/#last (par exemple has_many) utilise une requête avec LIMIT pour récupérer les résultats plutôt que de charger l'ensemble de la collection. (Pull Request)

  • inspect sur les classes de modèle Active Record n'initie pas une nouvelle connexion. Cela signifie que l'appel à inspect, lorsque la base de données est manquante, ne lèvera plus d'exception. (Pull Request)

  • Suppression des restrictions de colonne pour count, laissant la base de données générer une erreur si le SQL est invalide. (Pull Request)

  • Rails détecte maintenant automatiquement les associations inverses. Si vous ne définissez pas l'option :inverse_of sur l'association, Active Record devinera l'association inverse en fonction de heuristiques. (Pull Request)

  • Gestion des attributs aliasés dans ActiveRecord::Relation. Lors de l'utilisation de clés symboliques, ActiveRecord traduira désormais les noms d'attributs aliasés en noms de colonnes réels utilisés dans la base de données. (Pull Request)

  • L'ERB dans les fichiers de fixtures n'est plus évalué dans le contexte de l'objet principal. Les méthodes d'aide utilisées par plusieurs fixtures doivent être définies dans des modules inclus dans ActiveRecord::FixtureSet.context_class. (Pull Request)

  • Ne créez pas ou ne supprimez pas la base de données de test si RAILS_ENV est spécifié explicitement. (Pull Request)

  • Relation n'a plus de méthodes mutatrices comme #map! et #delete_if. Convertissez en un Array en appelant #to_a avant d'utiliser ces méthodes. (Pull Request)

  • find_in_batches, find_each, Result#each et Enumerable#index_by renvoient maintenant un Enumerator qui peut calculer sa taille. (Pull Request)

  • scope, enum et les associations lèvent maintenant une erreur en cas de conflit de noms "dangereux". (Pull Request, Pull Request)

  • Les méthodes second à fifth agissent comme le finder first. (Pull Request)

  • touch déclenche maintenant les callbacks after_commit et after_rollback. (Pull Request)

  • Activation des index partiels pour sqlite >= 3.8.0. (Pull Request)

  • change_column_null est maintenant réversible. (Commit)

  • Ajout d'un indicateur pour désactiver la génération du schéma après la migration. Par défaut, cela est désactivé dans l'environnement de production pour les nouvelles applications. (Pull Request)

7 Active Model

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

7.1 Dépréciations

  • Dépréciation de Validator#setup. Cela doit maintenant être fait manuellement dans le constructeur du validateur. (Commit)

7.2 Changements notables

  • Ajout des nouvelles méthodes d'API reset_changes et changes_applied à ActiveModel::Dirty qui contrôlent l'état des modifications.

  • Possibilité de spécifier plusieurs contextes lors de la définition d'une validation. (Pull Request)

  • attribute_changed? accepte maintenant un hash pour vérifier si l'attribut a été modifié :from et/ou :to une valeur donnée. (Pull Request)

8 Active Support

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

8.1 Suppressions

  • Suppression de la dépendance MultiJSON. En conséquence, ActiveSupport::JSON.decode n'accepte plus un hash d'options pour MultiJSON. (Pull Request / Plus de détails)

  • Suppression de la prise en charge du crochet encode_json utilisé pour encoder des objets personnalisés en JSON. Cette fonctionnalité a été extraite dans le gem activesupport-json_encoder. (Pull Request associé / Plus de détails)

  • Suppression de la classe dépréciée ActiveSupport::JSON::Variable sans remplacement.

  • Suppression des extensions de base String#encoding_aware? (core_ext/string/encoding).

  • Suppression de la méthode dépréciée Module#local_constant_names au profit de Module#local_constants.

  • Suppression de la méthode dépréciée DateTime.local_offset au profit de DateTime.civil_from_format.

  • Suppression des extensions de base Logger (core_ext/logger.rb).

  • Suppression des méthodes dépréciées Time#time_with_datetime_fallback, Time#utc_time et Time#local_time au profit de Time#utc et Time#local.

  • Suppression de la méthode dépréciée Hash#diff sans remplacement.

  • Suppression de la méthode dépréciée Date#to_time_in_current_zone au profit de Date#in_time_zone.

  • Suppression de la méthode dépréciée Proc#bind sans remplacement.

  • Suppression des méthodes dépréciées Array#uniq_by et Array#uniq_by!, utilisez plutôt les méthodes natives Array#uniq et Array#uniq!.

  • Suppression de la classe dépréciée ActiveSupport::BasicObject, utilisez ActiveSupport::ProxyObject à la place.

  • Suppression de la classe dépréciée BufferedLogger, utilisez ActiveSupport::Logger à la place.

  • Suppression des méthodes dépréciées assert_present et assert_blank, utilisez assert object.blank? et assert object.present? à la place.

  • Suppression de la méthode dépréciée #filter pour les objets de filtre, utilisez la méthode correspondante à la place (par exemple, #before pour un filtre avant).

  • Suppression de l'inflection irrégulière 'cow' => 'kine' des inflections par défaut. (Commit)

8.2 Dépréciations

  • Dépréciation des méthodes Numeric#{ago,until,since,from_now}, il est maintenant attendu que l'utilisateur convertisse explicitement la valeur en AS::Duration, par exemple 5.ago => 5.seconds.ago. (Pull Request)

  • Dépréciation du chemin d'inclusion active_support/core_ext/object/to_json. Utilisez active_support/core_ext/object/json à la place. (Pull Request)

  • Dépréciation de ActiveSupport::JSON::Encoding::CircularReferenceError. Cette fonctionnalité a été extraite dans le gem activesupport-json_encoder. (Pull Request / Plus de détails)

  • Dépréciation de l'option ActiveSupport.encode_big_decimal_as_string. Cette fonctionnalité a été extraite dans le gem activesupport-json_encoder. (Pull Request / Plus de détails)

  • Dépréciation de la sérialisation personnalisée de BigDecimal. (Pull Request)

8.3 Changements notables

  • L'encodeur JSON d'ActiveSupport a été réécrit pour tirer parti du gem JSON plutôt que de faire un encodage personnalisé en pur Ruby. (Pull Request / Plus de détails)

  • Amélioration de la compatibilité avec le gem JSON. (Pull Request / Plus de détails)

  • Ajout des méthodes ActiveSupport::Testing::TimeHelpers#travel et #travel_to. Ces méthodes modifient l'heure actuelle en la remplaçant par l'heure ou la durée donnée en substituant Time.now et Date.today.

  • Ajout de ActiveSupport::Testing::TimeHelpers#travel_back. Cette méthode renvoie l'heure actuelle à l'état d'origine, en supprimant les stubs ajoutés par travel et travel_to. (Pull Request)

  • Ajout de Numeric#in_milliseconds, comme 1.hour.in_milliseconds, afin de pouvoir les utiliser avec des fonctions JavaScript comme getTime(). (Commit)

  • Ajout des méthodes Date#middle_of_day, DateTime#middle_of_day et Time#middle_of_day. Ajout également des alias midday, noon, at_midday, at_noon et at_middle_of_day. (Pull Request)

  • Ajout des méthodes Date#all_week/month/quarter/year pour générer des plages de dates. (Pull Request)

  • Ajout de Time.zone.yesterday et Time.zone.tomorrow. (Pull Request)

  • Ajout de String#remove(pattern) comme raccourci pour le motif courant de String#gsub(pattern,''). (Commit)

  • Ajout de Hash#compact et Hash#compact! pour supprimer les éléments ayant une valeur nulle d'un hash. (Pull Request)

  • blank? et present? renvoient des singletons. (Commit)

  • Configuration par défaut de I18n.enforce_available_locales à true, ce qui signifie que I18n s'assurera que toutes les locales qui lui sont passées doivent être déclarées dans la liste available_locales. (Pull Request)

  • Introduction de Module#concerning : une façon naturelle et simple de séparer les responsabilités au sein d'une classe. (Commit)

  • Ajout de Object#presence_in pour simplifier l'ajout de valeurs à une liste autorisée. (Commit)

9 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 aujourd'hui. 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.