web-dev-qa-db-fra.com

Comment résoudre l'avertissement de dépréciation "La méthode to_hash est déconseillée et sera supprimée dans Rails 5.1"

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?

38
Trejkaz

Utilisation .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:

  1. Utilisez toujours .permit pour mettre en liste blanche les valeurs que vous attendez
  2. Utilisation .to_h pour vous assurer que si vous avez oublié l'étape 1, rien ne passera
  3. Si vous voulez vraiment les valeurs brutes, n'appelez pas .permit et appelez .to_unsafe_hash
  4. N'appelez pas .to_hash parce que c'est maintenant ambigu
65
Nathan Long