ruby-on-rails - que - ruby on rails tutorial
Cómo resuelvo la advertencia de desactivación "El método to_hash está en desuso y se eliminará en Rails 5.1" (1)
Usar .to_h
Puede llamar a .to_h
para obtener un hash seguro, de acuerdo con un comentario en Rails PR .
Ahora hay tres métodos para convertir parámetros a un hash.
-
.to_h
significa "si no he llamado.permit
, supongo que nada está permitido". -
.to_unsafe_h
significa "si no he llamado.permit
, supongo que todo está permitido". -
.to_hash
ahora es ambiguo. Rails lo trata como.to_unsafe_h
, pero imprime una advertencia porque no ha indicado explícitamente cuál de las dos opciones anteriores deseaba.
Primero, veamos qué pasa si no has llamado .permit
. En una consola de 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
Sin embargo, si llama primero a .permit
, no habrá forma de obtener los valores no permitidos.
> 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
Asi que:
- Siempre use
.permit
para.permit
en la lista blanca los valores que espera - Use
.to_h
para asegurarse de que si se olvidó del paso 1, nada pasará - Si realmente quiere los valores en bruto, no llame a
.permit
y llame a.to_unsafe_hash
- No llame a
.to_hash
porque eso ahora es ambiguo
Estoy intentando actualizar a Rails 5, recibo la siguiente advertencia de obsolescencia:
ADVERTENCIA DE DEPRESIÓN: El método to_hash está en desuso y se eliminará en Rails 5.1, ya que
ActionController::Parameters
ya no hereda de hash. El uso de este comportamiento obsoleto expone a posibles problemas de seguridad. Si continúa utilizando este método, puede estar creando una vulnerabilidad de seguridad en su aplicación que pueda ser explotada. En su lugar, considere usar uno de estos métodos documentados que no están en desuso: http://api.rubyonrails.org/v5.0.0/classes/ActionController/Parameters.html (llamado desde column_header en / Data / Projects / portal / trunk / app /helpers/application_helper.rb:114)
La línea en la que se encuentra la advertencia se ve así:
link_to(name,
{
action: action_name,
params: params.merge({ order: key, page: nil })
},
{
title: "Sort by this field",
}) +
Como puede ver, no estoy llamando to_hash
. Tal vez Rails es. Tal vez alguna otra gema es. No tengo forma de saberlo, porque no pensaron que valiera la pena proporcionar un seguimiento de pila. (Consejo profesional: ¡por lo general vale la pena proporcionar un seguimiento de pila!)
Así que de todos modos, seguí el enlace, planeando encontrar un reemplazo, y el método de merge
no parece estar en desuso , pero tal vez simplemente se olvidó de documentar el estado obsoleto, por lo que no puedo estar realmente seguro.
Entonces, ¿qué se supone que debo hacer para aclarar esto?