🚂

RailsのStrong Parametersで複数キーのネストしたパラメータにrequire/permitを適用する

2023/01/15に公開

例えば以下のパラメータを受け取るときにreportauthorに対してrequireを、それらの配下の値に対してpermitを適用したい場合です。

{
  "report": {
    "title": "title",
    "category": "study"
  },
  "author": {
    "name": "John",
    "email": "johon@example.com"
  }
}

以下のように書くことができます。

report_params, author_params = params.require(%i[report author])
ActionController::Parameters.new({
  report: report_params.permit(:title, :category),
  author: author_params.permit(:name, :email)
}).permit!

ネストされた値に対して、requireを適用したい場合は、以下のように書くことができます。

report_params, author_params = params.require(%i[report author])
ActionController::Parameters.new({
  report: report_params.permit(:title, :category).tap{ |p| p.require(:title) },
  author: author_params.permit(:name, :email).tap{ |p| p.require(:name) }
}).permit!

最後に。そもそも、例のような複数のキーのパラメータを受け取るAPIは責務を持ちすぎているかもしれません。
APIを分割することの方が解決策としてベターな場合もあると思います。

参考

Discussion