38 votes

Comment résoudre le avertissement de dépréciation "La méthode to_hash est dépréciée et sera supprimée dans Rails 5.1" ?

Je suis en train de essayer de passer à Rails 5, je reçois le avertissement de dépréciation suivant :

AVERTISSEMENT DÉPRÉCIÉ : La méthode to_hash est dépréciée et sera supprimée dans Rails 5.1, car ActionController::Parameters n'hérite plus de hash. L'utilisation de ce comportement déprécié expose des problèmes de sécurité potentiels. Si vous continuez d'utiliser cette méthode, vous pourriez créer 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épréciées : http://api.rubyonrails.org/v5.0.0/classes/ActionController/Parameters.html (appelé depuis column_header à /Data/Projects/portal/trunk/app/helpers/application_helper.rb:114)

La ligne sur laquelle se trouve l'avertissement semble comme suit :

    link_to(name,
            {
              action: action_name,
              params: params.merge({ order: key, page: nil })
            },
            {
              title: "Trier par ce champ",
            }) +

Comme vous pouvez le voir, je n'appelle pas to_hash. Peut-être que Rails le fait. Peut-être qu'un autre gem le fait. Je n'ai aucun moyen de le savoir, car ils n'ont pas jugé utile de fournir une trace de la pile. (Conseil professionnel - il est généralement utile de fournir une trace de la pile !)

Donc j'ai suivi le lien, en planifiant de trouver un remplaçant, et la méthode merge ne semble pas être dépréciée, mais peut-être qu'ils ont simplement oublié de documenter le statut de dépréciation, donc je ne peux pas vraiment être sûr.

Alors que suis-je censé faire pour résoudre cela ?

67voto

Nathan Long Points 30303

Utilisez .to_h

Vous pouvez appeler .to_h pour obtenir un hash sécurisé, selon un commentaire sur le PR de Rails.

Il existe maintenant trois méthodes pour convertir des paramètres en un hash.

  • .to_h signifie "si je n'ai pas appelé .permit, n'autorisez rien."
  • .to_unsafe_h signifie "si je n'ai pas appelé .permit, autorisez tout."
  • .to_hash est désormais ambigu. Rails le traite comme .to_unsafe_h, mais affiche un avertissement car vous n'avez pas explicitement indiqué 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
{} # hash vide car rien n'a été autorisé

> params.to_unsafe_h
{"yes"=>"y", "no"=>"n"} # valeurs brutes sans avertissement; vous l'avez demandé

> params.to_hash
# (affiche un avertissement de dépréciation - si vous voulez des valeurs non sécurisées, dites-le)
{"yes"=>"y", "no"=>"n"} # renvoie les valeurs brutes

Cependant, si vous appelez d'abord .permit, 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)
# (affiche un avertissement concernant le paramètre non autorisé :no)

> params.to_h
{"yes"=>"y"} # seules les valeurs autorisées

> params.to_unsafe_h
{"yes"=>"y"} # seules les valeurs autorisées

> params.to_hash
# (affiche un avertissement de dépréciation, mais reste sécurisé)
{"yes"=>"y"} # seules les valeurs autorisées

Donc :

  1. Utilisez toujours .permit pour autoriser 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, n'appelez pas .permit et appelez .to_unsafe_hash
  4. Ne pas appeler .to_hash car c'est désormais ambigu

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X