Подтвердить что ты не робот

Как устранить предупреждение об устаревании "Метод to_hash устарел и будет удален в Rails 5.1"

Я пытаюсь обновить Rails 5, я получаю следующее предупреждение об отказе:

ПРЕДУПРЕЖДЕНИЕ О ДЕПРЕКАЦИИ: метод to_hash устарел и будет удален в Rails 5.1, поскольку ActionController::Parameters больше не наследуется от хеша. Использование этого устаревшего поведения создает потенциальные проблемы безопасности. Если вы продолжаете использовать этот метод, вы можете создать уязвимость в вашем приложении, которая может быть использована. Вместо этого рассмотрите использование одного из этих документированных методов, которые не устарели: http://api.rubyonrails.org/v5.0.0/classes/ActionController/Parameters.html (вызывается из column_header в/Data/Projects/portal/trunk/приложение/хелперы/application_helper.rb: 114)

Строка, на которой отображается предупреждение, выглядит следующим образом:

    link_to(name,
            {
              action: action_name,
              params: params.merge({ order: key, page: nil })
            },
            {
              title: "Sort by this field",
            }) +

Как вы можете видеть, я не звоню to_hash. Может быть, Rails. Может быть, какой-то другой камень. Я не могу сказать, потому что они не думали, что стоит потратить трассировку стека. (Pro tip - обычно стоит выделить трассировку стека!)

Так или иначе, я пошел по ссылке, планируя найти замену, и метод merge не считается устаревшим, но возможно, они просто забыли документировать устаревший статус, поэтому я не могу быть уверен.

Итак, что я должен сделать, чтобы очистить это?

4b9b3361

Ответ 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, потому что теперь двусмысленный