Ответ 1
Используйте .to_h
Вы можете позвонить .to_h
, чтобы получить безопасный хэш, в соответствии с комментарий к Rails PR.
В настоящее время существует три метода преобразования параметров в хэш.
-
.to_h
означает "если я не звонил.permit
, не допускайте, чтобы ничего не было разрешено". -
.to_unsafe_h
означает "если я не вызывал.permit
, допустим, что все разрешено". -
.to_hash
теперь неоднозначно. Rails рассматривает его как.to_unsafe_h
, но выводит предупреждение, потому что вы явно не указали, какой из двух вариантов вам больше не нужен.
Во-первых, посмотрим, что произойдет, если вы не вызвали .permit
. В консоли 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
Однако, если вы сначала вызываете .permit
, не будет способа получить недопустимые значения.
> 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
Итак:
- Всегда используйте
.permit
для белого списка ожидаемых значений - Используйте
.to_h
, чтобы убедиться, что если вы забыли шаг 1, ничто не пройдет через - Если вам действительно нужны исходные значения, не вызывайте
.permit
и вызывайте.to_unsafe_hash
- Не вызывайте
.to_hash
, потому что теперь двусмысленный