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?

36
demandé sur Trejkaz 2016-08-02 05:31:02

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:

  1. utilisez toujours .permit pour mettre en liste blanche les valeurs que vous attendez
  2. Utilisez .to_h pour vous assurer que si vous avez oublié l'étape 1, Rien ne passera
  3. Si vous voulez vraiment les valeurs brutes, ne le faites pas appelez .permit et appelez .to_unsafe_hash
  4. N'appelez pas .to_hash parce que c'est maintenant ambigu
59
répondu Nathan Long 2016-09-30 11:16:37