Comment puis-je résoudre l'avertissement de dépréciation " la méthode de hachage est obsolète et sera supprimée dans Rails 5.1"
J'essaie de mettre à jour 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, Car
ActionController::Parameters
n'hérite plus du hachage. L'utilisation de ce comportement obsolète expose des problèmes de sécurité potentiels. Si vous continuez à utiliser cette méthode, vous pouvez créer une faille de sécurité dans votre application qui peuvent être exploitées. Au lieu de cela, envisagez d'utiliser l'une de ces méthodes documentées qui ne sont pas obsolètes: http://api.rubyonrails.org/v5.0.0/classes/ActionController/Parameters.html (appelé depuis column_header dans / Data / Projects / portal/trunk/app/helpers / application_helper.rb: 114)
La ligne sur laquelle se trouve l'avertissement 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 une autre gemme. 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-il est généralement est {[16] } vaut la peine de fournir une pile trace!)
Donc de toute façon, j'ai suivi le lien, prévoyant de trouver un remplacement, et la méthode merge
ne semble pas être obsolète , mais peut-être qu'ils ont simplement oublié de documenter le statut obsolète, donc je ne peux pas vraiment être sûr.
Alors, Que suis-je censé faire pour effacer cela?
1 réponses
Utiliser .to_h
, Vous pouvez appeler .to_h
pour obtenir un coffre-fort de hachage, selon un commentaire sur les 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 permis." -
.to_unsafe_h
signifie "si je n'ai pas appelé.permit
, supposons que tout est permis." -
.to_hash
est maintenant ambigu. Rails le traite comme.to_unsafe_h
, mais imprime un avertissement parce que vous ne l'avez pas explicitement dit laquelle des deux options ci-dessus vous vouliez.
Tout d'Abord, voyons 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
en premier, 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:
- utilisez toujours
.permit
pour mettre en liste blanche les valeurs que vous attendez - Utilisez
.to_h
pour vous assurer que si vous avez oublié l'étape 1, Rien ne passera - Si vous voulez vraiment les valeurs brutes, ne le faites pas appelez
.permit
et appelez.to_unsafe_hash
- N'appelez pas
.to_hash
parce que c'est maintenant ambigu