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 deActiveRecord::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
etrake 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 avecdb/schema.rb
(oudb/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é avecconfig.active_record.maintain_test_schema = false
. (Demande de tirage)Introduire
Rails.gem_version
comme une méthode pratique pour retournerGem::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
, utilisezActionView::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 utilisantxhr :get, :foo, format: :js
au lieu deget :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
etrender :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 deSchemaCache
:primary_keys
,tables
,columns
etcolumns_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 debegin_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 deActiveRecord::Fixtures.default_fixture_model_name
.Suppression de
columns_for_remove
dépréciée deSchemaStatements
.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
deRelation#count
.Suppression des méthodes dépréciées
partial_updates
,partial_updates?
etpartial_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éthodereadonly
explicitement pour marquer les enregistrements commereadonly
. (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
etActiveRecord::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
etMysql2Adapter
.type_cast
renverra1
pourtrue
et0
pourfalse
. (Pull Request).unscope
supprime maintenant les conditions spécifiées dansdefault_scope
. (Commit)Ajout de
ActiveRecord::QueryMethods#rewhere
qui écrira par-dessus une conditionwhere
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 uneArgumentError
chaque fois qu'il reçoit un argumentnil
. 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 exemplehas_many
) utilise une requête avecLIMIT
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 unArray
en appelant#to_a
avant d'utiliser ces méthodes. (Pull Request)find_in_batches
,find_each
,Result#each
etEnumerable#index_by
renvoient maintenant unEnumerator
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 finderfirst
. (Pull Request)touch
déclenche maintenant les callbacksafter_commit
etafter_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
etchanges_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 pourMultiJSON
. (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 deModule#local_constants
.Suppression de la méthode dépréciée
DateTime.local_offset
au profit deDateTime.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
etTime#local_time
au profit deTime#utc
etTime#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 deDate#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
etArray#uniq_by!
, utilisez plutôt les méthodes nativesArray#uniq
etArray#uniq!
.Suppression de la classe dépréciée
ActiveSupport::BasicObject
, utilisezActiveSupport::ProxyObject
à la place.Suppression de la classe dépréciée
BufferedLogger
, utilisezActiveSupport::Logger
à la place.Suppression des méthodes dépréciées
assert_present
etassert_blank
, utilisezassert object.blank?
etassert 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 enAS::Duration
, par exemple5.ago
=>5.seconds.ago
. (Pull Request)Dépréciation du chemin d'inclusion
active_support/core_ext/object/to_json
. Utilisezactive_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 substituantTime.now
etDate.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 partravel
ettravel_to
. (Pull Request)Ajout de
Numeric#in_milliseconds
, comme1.hour.in_milliseconds
, afin de pouvoir les utiliser avec des fonctions JavaScript commegetTime()
. (Commit)Ajout des méthodes
Date#middle_of_day
,DateTime#middle_of_day
etTime#middle_of_day
. Ajout également des aliasmidday
,noon
,at_midday
,at_noon
etat_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
etTime.zone.tomorrow
. (Pull Request)Ajout de
String#remove(pattern)
comme raccourci pour le motif courant deString#gsub(pattern,'')
. (Commit)Ajout de
Hash#compact
etHash#compact!
pour supprimer les éléments ayant une valeur nulle d'un hash. (Pull Request)blank?
etpresent?
renvoient des singletons. (Commit)Configuration par défaut de
I18n.enforce_available_locales
àtrue
, ce qui signifie queI18n
s'assurera que toutes les locales qui lui sont passées doivent être déclarées dans la listeavailable_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.