web-dev-qa-db-ja.com

非推奨の警告「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 (/Data/Projects/portal/trunk/app/helpers/application_helper.rb:114のcolumn_headerから呼び出されます)

警告が表示されている行は次のようになります。

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

ご覧のとおり、私はto_hashを呼び出していません。たぶんRailsです。たぶん他のgemはあります。スタックトレースを提供する価値があるとは思わなかったので、私は伝える方法がありません。プロのヒント-通常isスタックトレースを提供する価値があります!)

とにかく、私はリンクをたどり、代替品を見つけることを計画しましたが、 mergeメソッドは表示されませんappear非推奨 になりますが、非推奨ステータスを文書化するのを忘れてしまったのかもしれません。

だから私はこれをクリアするために何をすべきか?

38
Trejkaz

.to_hを使用

Rails PRに対するコメント に従って、.to_hを呼び出して安全なハッシュを取得できます。

現在、パラメーターをハッシュに変換する方法は3つあります。

  • .to_hは、「.permitを呼び出していない場合は、何も許可されていないと想定する」という意味です。
  • .to_unsafe_hは、「.permitを呼び出していない場合、すべてが許可されていると想定する」という意味です。
  • .to_hashがあいまいになりました。 Railsは.to_unsafe_hのように処理しますが、上記の2つのオプションのどちらを使用するかを明示的に指定していないため、警告を出力します。

まず、.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

そう:

  1. 常に.permitを使用して、期待する値をホワイトリストに登録してください
  2. .to_hを使用して、ステップ1を忘れた場合に何も処理されないようにします
  3. あなたが本当に生の値が欲しいなら、.permitを呼び出して.to_unsafe_hashを呼び出さないでください
  4. .to_hashを呼び出さないでください。
65
Nathan Long