params.expectで配列のパラメータを許可するには明示的に二重の角括弧([[ :属性名 ]])が必要

85 views Post
wakairo @wakairo

Rails8では、requirepermitに代わるより安全な新しいメソッドとして、strong parametersへexpectが導入されました。

expectでは、安全面への配慮から、配列のパラメータを指定する方法がpermitに比べ厳格化されています。 具体的には、配列のパラメータを許可するには明示的に二重の角括弧([[ :属性名 ]])が必要となりました。

配列のパラメータを許可する具体的な方法(引用元: expectのAPIドキュメント)は以下の通りです。

params = ActionController::Parameters.new(comments: [{ text: "hello" }, { text: "world" }])
params.expect(comments: [[:text]])
# => [#<ActionController::Parameters { "text" => "hello" } permitted: true>,
#     #<ActionController::Parameters { "text" => "world" } permitted: true>]

なお、安全のためにexpectがこの二重の括弧の記法を採用した背景については、Rails 8: strong parametersの新しいparams.expectの使い方(翻訳)を参照ください。

0
Raw
https://www.techtips.page/en/comments/842
wakairo @wakairo
Last edited

ちなみに、RuboCopにrequirepermitの組み合わせからexpectへの書き換えを自動でやってもらうことは可能ですが、配列パラメータの許可に関してはRuboCopが自動書き換えに失敗する場合があります。

その理由は以下の記述は、配列のパラメータも配列でないパラメータも許可してしまうため、RuboCopとしては配列なのかそうでないのかの判定が機械的に行えないためであると考えられます。

permit(user: [:name])

より詳しくは、前述の記事のこちらの箇所を参照ください。

0
Raw
https://www.techtips.page/en/comments/843