1 Mise à niveau vers Rails 3.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 3 au cas où vous ne l'auriez pas fait et vous assurer que votre application fonctionne toujours comme prévu avant de tenter de passer à Rails 3.1. Ensuite, tenez compte des changements suivants :
1.1 Rails 3.1 nécessite au moins Ruby 1.8.7
Rails 3.1 nécessite Ruby 1.8.7 ou une version supérieure. Le support de toutes les versions précédentes de Ruby a été abandonné officiellement et vous devriez effectuer la mise à niveau dès que possible. Rails 3.1 est également compatible avec Ruby 1.9.2.
CONSEIL : Notez que les versions p248 et p249 de Ruby 1.8.7 ont des bugs de sérialisation qui font planter Rails. Ruby Enterprise Edition les a corrigés depuis la version 1.8.7-2010.02. En ce qui concerne la version 1.9, Ruby 1.9.1 n'est pas utilisable car il plante carrément, donc si vous voulez utiliser la version 1.9.x, passez directement à la version 1.9.2 pour une utilisation sans problème.
1.2 Ce qu'il faut mettre à jour dans vos applications
Les changements suivants sont destinés à la mise à niveau de votre application vers Rails 3.1.3, la dernière version 3.1.x de Rails.
1.2.1 Gemfile
Effectuez les changements suivants dans votre Gemfile
.
gem 'rails', '= 3.1.3'
gem 'mysql2'
# Nécessaire pour le nouveau pipeline d'assets
group :assets do
gem 'sass-rails', "~> 3.1.5"
gem 'coffee-rails', "~> 3.1.1"
gem 'uglifier', ">= 1.0.3"
end
# jQuery est la bibliothèque JavaScript par défaut dans Rails 3.1
gem 'jquery-rails'
1.2.2 config/application.rb
Le pipeline d'assets nécessite les ajouts suivants :
config.assets.enabled = true config.assets.version = '1.0'
Si votre application utilise la route "/assets" pour une ressource, vous voudrez peut-être changer le préfixe utilisé pour les assets afin d'éviter les conflits :
# Par défaut : '/assets' config.assets.prefix = '/asset-files'
1.2.3 config/environments/development.rb
Supprimez le paramètre RJS
config.action_view.debug_rjs = true
.Ajoutez ce qui suit, si vous activez le pipeline d'assets.
# Ne pas compresser les assets config.assets.compress = false # Développe les lignes qui chargent les assets config.assets.debug = true
1.2.4 config/environments/production.rb
Encore une fois, la plupart des changements ci-dessous concernent le pipeline d'assets. Vous pouvez en savoir plus à ce sujet dans le guide Pipeline d'assets.
# Compresser les JavaScripts et CSS config.assets.compress = true # Ne pas revenir au pipeline d'assets si un asset précompilé est manquant config.assets.compile = false # Générer des empreintes pour les URLs des assets config.assets.digest = true # Par défaut : Rails.root.join("public/assets") # config.assets.manifest = YOUR_PATH # Précompiler des assets supplémentaires (application.js, application.css, et tous les fichiers non JS/CSS sont déjà ajoutés) # config.assets.precompile `= %w( admin.js admin.css ) # Forcer l'accès à l'application via SSL, utiliser Strict-Transport-Security et des cookies sécurisés. # config.force_ssl = true
1.2.5 config/environments/test.rb
# Configurer le serveur d'assets statiques pour les tests avec Cache-Control pour les performances
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
1.2.6 config/initializers/wrap_parameters.rb
Ajoutez ce fichier avec le contenu suivant, si vous souhaitez envelopper les paramètres dans un hash imbriqué. C'est activé par défaut dans les nouvelles applications.
# Assurez-vous de redémarrer votre serveur lorsque vous modifiez ce fichier. # Ce fichier contient les paramètres pour ActionController::ParamsWrapper qui # est activé par défaut. # Activer l'enveloppement des paramètres pour JSON. Vous pouvez désactiver cela en définissant :format sur un tableau vide. ActiveSupport.on_load(:action_controller) do wrap_parameters :format => [:json] end # Désactiver l'élément racine dans JSON par défaut. ActiveSupport.on_load(:active_record) do self.include_root_in_json = false end
1.2.7 Supprimez les options :cache et :concat dans les références aux helpers d'assets dans les vues
- Avec le pipeline d'assets, les options :cache et :concat ne sont plus utilisées, supprimez ces options de vos vues.
2 Création d'une application Rails 3.1
# 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 à la pointe
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 voulez regrouper directement à partir du référentiel Git, vous pouvez passer le drapeau --edge
:
$ rails new myapp --edge
Si vous avez une copie locale du référentiel Rails et que vous voulez générer une application à partir de celui-ci, vous pouvez passer le drapeau --dev
:
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
3 Changements architecturaux de Rails
3.1 Pipeline des ressources
Le changement majeur dans Rails 3.1 est le pipeline des ressources. Il rend les feuilles de style CSS et les fichiers JavaScript des citoyens de première classe et permet une organisation appropriée, y compris leur utilisation dans les plugins et les moteurs.
Le pipeline des ressources est alimenté par Sprockets et est couvert dans le guide Pipeline des ressources.
3.2 Streaming HTTP
Le streaming HTTP est un autre changement introduit dans Rails 3.1. Cela permet au navigateur de télécharger vos feuilles de style et fichiers JavaScript pendant que le serveur génère toujours la réponse. Cela nécessite Ruby 1.9.2, est facultatif et nécessite également le support du serveur web, mais la combinaison populaire de NGINX et Unicorn est prête à en profiter.
3.3 La bibliothèque JS par défaut est maintenant jQuery
jQuery est la bibliothèque JavaScript par défaut fournie avec Rails 3.1. Mais si vous utilisez Prototype, il est simple de passer à celui-ci.
$ rails new myapp -j prototype
3.4 Identity Map
Active Record dispose d'une Identity Map dans Rails 3.1. Une Identity Map conserve les enregistrements précédemment instanciés et renvoie l'objet associé à l'enregistrement s'il est à nouveau accédé. L'Identity Map est créée pour chaque requête et est vidée à la fin de la requête.
Rails 3.1 est livré avec l'Identity Map désactivée par défaut.
4 Railties
jQuery est la nouvelle bibliothèque JavaScript par défaut.
jQuery et Prototype ne sont plus vendus et sont désormais fournis par les gemmes
jquery-rails
etprototype-rails
.Le générateur d'applications accepte une option
-j
qui peut être une chaîne arbitraire. Si "foo" est passé, la gemme "foo-rails" est ajoutée auGemfile
, et le manifeste JavaScript de l'application nécessite "foo" et "foo_ujs". Actuellement, seules "prototype-rails" et "jquery-rails" existent et fournissent ces fichiers via le pipeline des ressources.La génération d'une application ou d'un plugin exécute
bundle install
à moins que--skip-gemfile
ou--skip-bundle
ne soit spécifié.Les générateurs de contrôleurs et de ressources génèrent désormais automatiquement des ébauches d'assets (cela peut être désactivé avec
--skip-assets
). Ces ébauches utiliseront CoffeeScript et Sass, si ces bibliothèques sont disponibles.Les générateurs de scaffold et d'application utilisent le style de hachage de Ruby 1.9 lorsqu'ils s'exécutent sur Ruby 1.9. Pour générer un hachage au style ancien,
--old-style-hash
peut être passé.Le générateur de contrôleurs de scaffold crée un bloc de format pour JSON au lieu de XML.
Les journaux d'Active Record sont dirigés vers STDOUT et affichés en ligne dans la console.
Ajout de la configuration
config.force_ssl
qui charge le middlewareRack::SSL
et force toutes les requêtes à être sous le protocole HTTPS.Ajout de la commande
rails plugin new
qui génère un plugin Rails avec un gemspec, des tests et une application fictive pour les tests.Ajout de
Rack::Etag
etRack::ConditionalGet
à la pile de middleware par défaut.Ajout de
Rack::Cache
à la pile de middleware par défaut.Les moteurs ont reçu une mise à jour majeure - Vous pouvez les monter à n'importe quel chemin, activer les assets, exécuter des générateurs, etc.
5 Action Pack
5.1 Action Controller
Un avertissement est affiché si l'authenticité du jeton CSRF ne peut pas être vérifiée.
Spécifiez
force_ssl
dans un contrôleur pour forcer le navigateur à transférer les données via le protocole HTTPS sur ce contrôleur particulier. Pour limiter aux actions spécifiques,:only
ou:except
peuvent être utilisés.Les paramètres de chaîne de requête sensibles spécifiés dans
config.filter_parameters
seront désormais filtrés des chemins de requête dans le journal.Les paramètres d'URL qui renvoient
nil
pourto_param
sont maintenant supprimés de la chaîne de requête.Ajout de
ActionController::ParamsWrapper
pour envelopper les paramètres dans un hachage imbriqué, et il sera activé par défaut pour les requêtes JSON dans les nouvelles applications. Cela peut être personnalisé dansconfig/initializers/wrap_parameters.rb
.Ajout de
config.action_controller.include_all_helpers
. Par défaut,helper :all
est effectué dansActionController::Base
, ce qui inclut tous les helpers par défaut. En définissantinclude_all_helpers
surfalse
, seulsapplication_helper
et l'helper correspondant au contrôleur (commefoo_helper
pourfoo_controller
) seront inclus.url_for
et les helpers d'URL nommés acceptent maintenant:subdomain
et:domain
comme options.Ajout de
Base.http_basic_authenticate_with
pour effectuer une authentification de base HTTP avec un seul appel de méthode de classe.class PostsController < ApplicationController USER_NAME, PASSWORD = "dhh", "secret" before_filter :authenticate, :except => [ :index ] def index render :text => "Tout le monde peut me voir!" end def edit render :text => "Je suis accessible uniquement si vous connaissez le mot de passe" end private def authenticate authenticate_or_request_with_http_basic do |user_name, password| user_name == USER_NAME && password == PASSWORD end end end
..peut maintenant être écrit comme suit
class PostsController < ApplicationController http_basic_authenticate_with :name => "dhh", :password => "secret", :except => :index def index render :text => "Tout le monde peut me voir!" end def edit render :text => "Je suis accessible uniquement si vous connaissez le mot de passe" end end
Ajout de la prise en charge du streaming, vous pouvez l'activer avec:
class PostsController < ActionController::Base stream end
Vous pouvez le restreindre à certaines actions en utilisant
:only
ou:except
. Veuillez lire la documentation surActionController::Streaming
pour plus d'informations.La méthode de routage de redirection accepte maintenant également un hachage d'options qui ne modifiera que les parties de l'URL en question, ou un objet qui répond à l'appel, permettant la réutilisation des redirections.
5.2 Action Dispatch
config.action_dispatch.x_sendfile_header
a maintenant la valeur par défautnil
etconfig/environments/production.rb
ne définit aucune valeur particulière pour celle-ci. Cela permet aux serveurs de la définir viaX-Sendfile-Type
.ActionDispatch::MiddlewareStack
utilise maintenant la composition plutôt que l'héritage et n'est plus un tableau.Ajout de
ActionDispatch::Request.ignore_accept_header
pour ignorer les en-têtes accept.Ajout de
Rack::Cache
à la pile par défaut.Déplacement de la responsabilité de l'etag de
ActionDispatch::Response
vers la pile de middleware.S'appuie sur l'API des magasins
Rack::Session
pour une plus grande compatibilité dans le monde Ruby. Cela est rétro-incompatible carRack::Session
s'attend à ce que#get_session
accepte quatre arguments et nécessite#destroy_session
au lieu de simplement#destroy
.La recherche de modèle recherche maintenant plus haut dans la chaîne d'héritage.
5.3 Action View
Ajout de l'option
:authenticity_token
àform_tag
pour une manipulation personnalisée ou pour omettre le jeton en passant:authenticity_token => false
.Création de
ActionView::Renderer
et spécification d'une API pourActionView::Context
.La mutation en place de
SafeBuffer
est interdite dans Rails 3.1.Ajout de l'aide
button_tag
HTML5.file_field
ajoute automatiquement:multipart => true
au formulaire englobant.Ajout d'une idiome pratique pour générer des attributs HTML5 data-* dans les aides de balises à partir d'un hachage
:data
d'options:tag("div", :data => {:name => 'Stephen', :city_state => %w(Chicago IL)}) # => <div data-name="Stephen" data-city-state="["Chicago","IL"]" />
Les clés sont transformées en tirets. Les valeurs sont encodées en JSON, sauf pour les chaînes de caractères et les symboles.
csrf_meta_tag
est renommé encsrf_meta_tags
et aliascsrf_meta_tag
pour assurer la compatibilité ascendante.L'ancienne API du gestionnaire de modèles est obsolète et la nouvelle API nécessite simplement que le gestionnaire de modèles réponde à l'appel.
rhtml et rxml sont enfin supprimés en tant que gestionnaires de modèles.
config.action_view.cache_template_loading
est réintroduit, ce qui permet de décider si les modèles doivent être mis en cache ou non.L'aide
submit
du formulaire ne génère plus un identifiant "object_name_id".Permet à
FormHelper#form_for
de spécifier la:method
comme une option directe au lieu de passer par le hachage:html
.form_for(@post, remote: true, method: :delete)
au lieu deform_for(@post, remote: true, html: { method: :delete })
.Fournit
JavaScriptHelper#j()
en tant qu'alias deJavaScriptHelper#escape_javascript()
. Cela remplace la méthodeObject#j()
que la gem JSON ajoute dans les modèles en utilisant JavaScriptHelper.Permet le format AM/PM dans les sélecteurs de date et d'heure.
auto_link
a été supprimé de Rails et extrait dans la gem rails_autolink
6 Active Record
Ajout d'une méthode de classe
pluralize_table_names
pour singulariser/pluraliser les noms de table des modèles individuels. Auparavant, cela ne pouvait être défini globalement pour tous les modèles viaActiveRecord::Base.pluralize_table_names
.class User < ActiveRecord::Base self.pluralize_table_names = false end
Ajout du réglage des attributs des associations singulières par bloc. Le bloc sera appelé après l'initialisation de l'instance.
class User < ActiveRecord::Base has_one :account end user.build_account{ |a| a.credit_limit = 100.0 }
Ajout de
ActiveRecord::Base.attribute_names
pour renvoyer une liste de noms d'attributs. Cela renverra un tableau vide si le modèle est abstrait ou si la table n'existe pas.Les fixtures CSV sont obsolètes et leur prise en charge sera supprimée dans Rails 3.2.0.
ActiveRecord#new
,ActiveRecord#create
etActiveRecord#update_attributes
acceptent tous un second hachage en option qui vous permet de spécifier quel rôle considérer lors de l'attribution des attributs. Cela est basé sur les nouvelles capacités d'assignation de masse d'Active Model. ```ruby class Post < ActiveRecord::Base attr_accessible :title attr_accessible :title, :published_at, :as => :admin end
Post.new(params[:post], :as => :admin) ```
default_scope
peut maintenant prendre un bloc, une lambda ou tout autre objet qui répond à l'appel pour une évaluation paresseuse.Les scopes par défaut sont maintenant évalués au moment le plus tardif possible, pour éviter les problèmes où des scopes seraient créés qui contiendraient implicitement le scope par défaut, ce qui serait alors impossible à supprimer via Model.unscoped.
L'adaptateur PostgreSQL ne prend en charge que la version 8.2 et supérieure de PostgreSQL.
Le middleware
ConnectionManagement
est modifié pour nettoyer le pool de connexions après que le corps de la rack a été vidé.Ajout d'une méthode
update_column
sur Active Record. Cette nouvelle méthode met à jour un attribut donné sur un objet, en sautant les validations et les callbacks. Il est recommandé d'utiliserupdate_attributes
ouupdate_attribute
sauf si vous êtes sûr de ne pas vouloir exécuter de callback, y compris la modification de la colonneupdated_at
. Elle ne doit pas être appelée sur de nouveaux enregistrements.Les associations avec une option
:through
peuvent maintenant utiliser n'importe quelle association en tant qu'association through ou source, y compris d'autres associations qui ont une option:through
et des associationshas_and_belongs_to_many
.La configuration de la connexion à la base de données actuelle est maintenant accessible via
ActiveRecord::Base.connection_config
.Les limites et les offsets sont supprimés des requêtes COUNT sauf si les deux sont fournis.
People.limit(1).count # => 'SELECT COUNT(*) FROM people'
People.offset(1).count # => 'SELECT COUNT(*) FROM people'
People.limit(1).offset(1).count # => 'SELECT COUNT(*) FROM people LIMIT 1 OFFSET 1'
ActiveRecord::Associations::AssociationProxy
a été divisé. Il existe maintenant une classeAssociation
(et des sous-classes) qui est responsable de l'opération sur les associations, puis un wrapper séparé et mince appeléCollectionProxy
, qui fait office de proxy pour les associations de collection. Cela évite la pollution de l'espace de noms, sépare les responsabilités et permettra d'autres refactorisations.Les associations singulières (
has_one
,belongs_to
) n'ont plus de proxy et renvoient simplement l'enregistrement associé ounil
. Cela signifie que vous ne devez pas utiliser de méthodes non documentées telles quebob.mother.create
- utilisez plutôtbob.create_mother
.Prise en charge de l'option
:dependent
sur les associationshas_many :through
. Pour des raisons historiques et pratiques,:delete_all
est la stratégie de suppression par défaut utilisée parassociation.delete(*records)
, malgré le fait que la stratégie par défaut est:nullify
pour les has_many réguliers. De plus, cela ne fonctionne que si la réflexion source est un belongs_to. Pour d'autres situations, vous devez modifier directement l'association through.Le comportement de
association.destroy
pourhas_and_belongs_to_many
ethas_many :through
est modifié. À partir de maintenant, 'destroy' ou 'delete' sur une association signifiera 'se débarrasser du lien', et non pas (nécessairement) 'se débarrasser des enregistrements associés'.Auparavant,
has_and_belongs_to_many.destroy(*records)
détruisait les enregistrements eux-mêmes. Il ne supprimait aucun enregistrement dans la table de jointure. Maintenant, il supprime les enregistrements dans la table de jointure.Auparavant,
has_many_through.destroy(*records)
détruisait les enregistrements eux-mêmes et les enregistrements dans la table de jointure. [Note : Ce n'a pas toujours été le cas ; les versions précédentes de Rails ne supprimaient que les enregistrements eux-mêmes.] Maintenant, il ne détruit que les enregistrements dans la table de jointure.Notez que ce changement est rétrocompatible dans une certaine mesure, mais malheureusement, il n'y a aucun moyen de le 'déprécier' avant de le changer. Le changement est effectué afin d'avoir une cohérence quant à la signification de 'destroy' ou 'delete' dans les différents types d'associations. Si vous souhaitez détruire les enregistrements eux-mêmes, vous pouvez le faire avec
records.association.each(&:destroy)
.Ajout de l'option
:bulk => true
àchange_table
pour effectuer toutes les modifications de schéma définies dans un bloc en utilisant une seule instruction ALTER.
change_table(:users, :bulk => true) do |t|
t.string :company_name
t.change :birthdate, :datetime
end
Suppression de la prise en charge de l'accès aux attributs sur une table de jointure
has_and_belongs_to_many
. Il faut utiliserhas_many :through
.Ajout d'une méthode
create_association!
pour les associationshas_one
etbelongs_to
.Les migrations sont maintenant réversibles, ce qui signifie que Rails saura comment inverser vos migrations. Pour utiliser des migrations réversibles, il suffit de définir la méthode
change
.
class MyMigration < ActiveRecord::Migration
def change
create_table(:horses) do |t|
t.column :content, :text
t.column :remind_at, :datetime
end
end
end
Certaines choses ne peuvent pas être automatiquement inversées pour vous. Si vous savez comment inverser ces choses, vous devez définir
up
etdown
dans votre migration. Si vous définissez quelque chose danschange
qui ne peut pas être inversé, une exceptionIrreversibleMigration
sera levée lors de la descente.Les migrations utilisent maintenant des méthodes d'instance plutôt que des méthodes de classe : ```ruby class FooMigration < ActiveRecord::Migration def up # Pas self.up
...
end end ```
Les fichiers de migration générés à partir des générateurs de modèle et de migration constructive (par exemple, add_name_to_users) utilisent la méthode
change
de la migration réversible au lieu des méthodes ordinairesup
etdown
.Suppression de la prise en charge de l'interpolation des conditions SQL de chaîne sur les associations. À la place, une procédure doit être utilisée.
has_many :things, :conditions => 'foo = #{bar}' # avant
has_many :things, :conditions => proc { "foo = #{bar}" } # après
À l'intérieur de la procédure, self
est l'objet qui est le propriétaire de l'association, sauf si vous chargez l'association de manière anticipée, auquel cas self
est la classe dans laquelle l'association se trouve.
Vous pouvez avoir toutes les conditions "normales" à l'intérieur de la procédure, donc ce qui suit fonctionnera également :
has_many :things, :conditions => proc { ["foo = ?", bar] }
Auparavant,
:insert_sql
et:delete_sql
sur l'associationhas_and_belongs_to_many
vous permettaient d'appeler 'record' pour obtenir l'enregistrement qui est inséré ou supprimé. Cela est maintenant passé en argument à la procédure.Ajout de
ActiveRecord::Base#has_secure_password
(viaActiveModel::SecurePassword
) pour encapsuler l'utilisation simple des mots de passe avec le chiffrement et le salage BCrypt.
# Schéma : User(name:string, password_digest:string, password_salt:string)
class User < ActiveRecord::Base
has_secure_password
end
Lorsqu'un modèle est généré,
add_index
est ajouté par défaut pour les colonnesbelongs_to
oureferences
.La définition de l'ID d'un objet
belongs_to
mettra à jour la référence vers l'objet.Les sémantiques de
ActiveRecord::Base#dup
etActiveRecord::Base#clone
ont été modifiées pour correspondre davantage aux sémantiques normales de dup et clone de Ruby.L'appel à
ActiveRecord::Base#clone
entraînera une copie superficielle de l'enregistrement, y compris la copie de l'état gelé. Aucun rappel ne sera appelé.L'appel à
ActiveRecord::Base#dup
dupliquera l'enregistrement, y compris l'appel des hooks après l'initialisation. L'état gelé ne sera pas copié et toutes les associations seront effacées. Un enregistrement dupliqué renverratrue
pournew_record?
, aura un champ d'IDnil
et peut être enregistré.Le cache de requête fonctionne maintenant avec les instructions préparées. Aucun changement n'est nécessaire dans les applications.
7 Active Model
attr_accessible
accepte une option:as
pour spécifier un rôle.InclusionValidator
,ExclusionValidator
etFormatValidator
acceptent maintenant une option qui peut être une procédure, une lambda ou tout ce qui répond àcall
. Cette option sera appelée avec l'enregistrement actuel en tant qu'argument et renvoie un objet qui répond àinclude?
pourInclusionValidator
etExclusionValidator
, et renvoie un objet d'expression régulière pourFormatValidator
.Ajout de
ActiveModel::SecurePassword
pour encapsuler l'utilisation simple des mots de passe avec le chiffrement et le salage BCrypt.ActiveModel::AttributeMethods
permet de définir des attributs à la demande.Ajout de la prise en charge de l'activation et de la désactivation sélective des observateurs.
La recherche dans l'espace de noms
I18n
alternatif n'est plus prise en charge.
8 Active Resource
- Le format par défaut a été changé en JSON pour toutes les requêtes. Si vous voulez continuer à utiliser XML, vous devrez définir
self.format = :xml
dans la classe. Par exemple,
class User < ActiveResource::Base
self.format = :xml
end
9 Active Support
ActiveSupport::Dependencies
lève maintenant uneNameError
s'il trouve une constante existante dansload_missing_constant
.Ajout d'une nouvelle méthode de rapport
Kernel#quietly
qui supprime à la foisSTDOUT
etSTDERR
.Ajout de
String#inquiry
en tant que méthode pratique pour transformer une chaîne en un objetStringInquirer
.Ajout de
Object#in?
pour tester si un objet est inclus dans un autre objet.La stratégie
LocalCache
est maintenant une véritable classe middleware et n'est plus une classe anonyme.La classe
ActiveSupport::Dependencies::ClassCache
a été introduite pour contenir des références aux classes rechargeables.ActiveSupport::Dependencies::Reference
a été refactorisé pour tirer parti directement de la nouvelleClassCache
.Rétroportage de
Range#cover?
en tant qu'alias deRange#include?
en Ruby 1.8.Ajout de
weeks_ago
etprev_week
à Date/DateTime/Time.Ajout du rappel
before_remove_const
àActiveSupport::Dependencies.remove_unloadable_constants!
.
Dépréciations :
ActiveSupport::SecureRandom
est déprécié au profit deSecureRandom
de la bibliothèque standard Ruby.
10 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. Félicitations à tous.
Les notes de version de Rails 3.1 ont été compilées par Vijay Dev
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.