J'essaie de mettre à jour vers Rails 5, je reçois l'avertissement de dépréciation suivant:
AVERTISSEMENT DE DÉPRÉCIATION: la méthode to_hash est obsolète et sera supprimée dans Rails 5.1, comme
ActionController::Parameters
n'hérite plus du hachage. L'utilisation de ce comportement obsolète expose les problèmes de sécurité potentiels. Si vous continuez à utiliser cette méthode, vous créez peut-être une vulnérabilité de sécurité dans votre application qui peut être exploitée. Au lieu de cela, envisagez d'utiliser l'une de ces méthodes documentées qui ne sont pas déconseillées: http://api.rubyonrails.org/v5.0.0/classes/ActionController/Parameters.html (appelé depuis column_header dans/Data/Projets/portail/trunk/app/helpers/application_helper.rb: 114)
La ligne sur laquelle l'avertissement se trouve ressemble à ceci:
link_to(name,
{
action: action_name,
params: params.merge({ order: key, page: nil })
},
{
title: "Sort by this field",
}) +
Comme vous pouvez le voir, je n'appelle pas to_hash
. Peut-être Rails est. Peut-être un autre bijou est. Je n'ai aucun moyen de le dire, car ils ne pensaient pas que cela valait la peine de fournir une trace de pile. (Astuce Pro - généralement ( vaut une trace de pile!)
Donc, de toute façon, j'ai suivi le lien, en prévoyant de trouver un remplaçant, et la méthode merge
n'apparaît pas pour être obsolète , mais ils ont peut-être simplement oublié de documenter l'état obsolète, donc je ne peux pas vraiment en être sûr.
Alors, que suis-je censé faire pour effacer cela?
.to_h
Tu peux appeler .to_h
pour obtenir un hachage sûr, selon n commentaire sur le Rails PR .
Il existe maintenant trois méthodes pour convertir des paramètres en hachage.
.to_h
signifie "si je n'ai pas appelé .permit
, supposons que rien n'est autorisé. ".to_unsafe_h
signifie "si je n'ai pas appelé .permit
, supposons que tout est autorisé. ".to_hash
est désormais ambigu. Rails le traite comme .to_unsafe_h
, mais affiche un avertissement car vous n'avez pas dit explicitement laquelle des deux options ci-dessus vous vouliez.Voyons d'abord ce qui se passe si vous n'avez pas appelé .permit
. Dans une console Rails 5.0:
> params = ActionController::Parameters.new({yes: "y", no: "n"})
> params.to_h
{} # empty hash because nothing has been permitted
> params.to_unsafe_h
{"yes"=>"y", "no"=>"n"} # raw values with no warning; you asked for it
> params.to_hash
# (puts deprecation warning - if you want unsafe values, say so)
{"yes"=>"y", "no"=>"n"} # returns raw values
Cependant, si vous appelez .permit
d'abord, il n'y aura aucun moyen d'obtenir les valeurs non autorisées.
> params = ActionController::Parameters.new({yes: "y", no: "n"})
> params = params.permit(:yes)
# (puts warning about unpermitted parameter :no)
> params.to_h
{"yes"=>"y"} # permitted values only
> params.to_unsafe_h
{"yes"=>"y"} # permitted values only
> params.to_hash
# (puts deprecation warning, but still safe)
{"yes"=>"y"} # permitted values only
Donc:
.permit
pour mettre en liste blanche les valeurs que vous attendez.to_h
pour vous assurer que si vous avez oublié l'étape 1, rien ne passera.permit
et appelez .to_unsafe_hash
.to_hash
parce que c'est maintenant ambigu