カテゴリ: Rails 更新日: 2025/11/25

RailsのStrong Parametersを完全解説!ネスト・配列・ハッシュのpermit書き方パターンまとめ

パラメータ完全攻略:ネスト・配列・ハッシュのpermit書き方パターン
パラメータ完全攻略:ネスト・配列・ハッシュのpermit書き方パターン

先生と生徒の会話形式で理解しよう

生徒

「Railsのパラメータって、どうやって安全に受け取ればいいんですか?」

先生

「Railsでは、Strong Parameters(ストロングパラメータ)という仕組みを使って、受け取るパラメータを明示的に制限できます。」

生徒

「ネストされたデータや配列も扱えるんですか?」

先生

「もちろん!ネストや配列もバッチリ対応できますよ。今回はその書き方を詳しく学んでいきましょう。」

1. Strong Parameters(ストロングパラメータ)とは?

1. Strong Parameters(ストロングパラメータ)とは?
1. Strong Parameters(ストロングパラメータ)とは?

Strong Parametersとは、Railsのセキュリティ機能のひとつで、ユーザーから送られてくるパラメータのうち、どれを許可(permit)するかを明確に定義する仕組みです。これにより、意図しない値の更新や、マスアサインメント脆弱性を防ぐことができます。

マスアサインメントとは、送られてきたすべてのパラメータがモデルに一括で代入されてしまう危険な状態のこと。Strong Parametersを使えば、それを防げるのです。

2. ネストされたパラメータのpermit書き方

2. ネストされたパラメータのpermit書き方
2. ネストされたパラメータのpermit書き方

フォームやAPIで送られてくるデータは、ネストされた構造(入れ子構造)になっていることがあります。たとえば、以下のような場合です。


params = {
  user: {
    name: "山田太郎",
    address: {
      city: "東京",
      zip: "100-0001"
    }
  }
}

このようなときは、次のようにpermitを記述します。


params.require(:user).permit(:name, address: [:city, :zip])

address: [:city, :zip]のように、ネストしたハッシュにはシンボルのキーと配列で許可する項目を記述します。

3. 配列のパラメータをpermitする方法

3. 配列のパラメータをpermitする方法
3. 配列のパラメータをpermitする方法

チェックボックスで複数選択された値や、タグなどの情報は配列として送られてくることがあります。例を見てみましょう。


params = {
  article: {
    title: "Rails入門",
    tags: ["Ruby", "Rails", "Web"]
  }
}

このときのpermitの書き方は以下のとおりです。


params.require(:article).permit(:title, tags: [])

tags: []のように、空の配列を渡すことで、どんな値でもOKな配列を許可する意味になります。

4. 配列の中身がハッシュの場合

4. 配列の中身がハッシュの場合
4. 配列の中身がハッシュの場合

さらにレベルアップした例として、「配列の中にハッシュが入っている」ケースもあります。これは複数の項目をまとめて送信する場面でよく使われます。


params = {
  order: {
    items: [
      { name: "りんご", quantity: 3 },
      { name: "バナナ", quantity: 5 }
    ]
  }
}

この場合のpermitの書き方はこうなります。


params.require(:order).permit(items: [:name, :quantity])

items: [:name, :quantity]のように、配列の中のハッシュの項目を指定するだけで、複雑な構造でも簡単に許可できます。

5. ネスト+配列+ハッシュの複合パターン

5. ネスト+配列+ハッシュの複合パターン
5. ネスト+配列+ハッシュの複合パターン

次はさらに複雑な「ネストされた中に配列があり、その配列の中身がハッシュ」になっているパターンです。


params = {
  customer: {
    name: "佐藤花子",
    contacts: {
      phones: [
        { type: "自宅", number: "090-1234-5678" },
        { type: "会社", number: "03-1234-5678" }
      ]
    }
  }
}

こうした構造のときでも、permitで柔軟に対応できます。


params.require(:customer).permit(
  :name,
  contacts: {
    phones: [:type, :number]
  }
)

contacts: { phones: [:type, :number] }のように、ネストの中にある配列の中のハッシュをpermitでしっかり指定しましょう。

6. permitしないとどうなる?

6. permitしないとどうなる?
6. permitしないとどうなる?

Strong Parametersでpermitしないと、Railsはパラメータをフィルタして破棄します。つまり、意図的に許可しないと、モデルに値が保存されないことになります。

また、requireを忘れるとエラーが発生することもあります。


ActionController::ParameterMissing (param is missing or the value is empty: user)

このようなエラーが出たときは、params.require(:user)のように書いてあるかどうかを確認しましょう。

7. よくあるStrong Parametersの書き方パターン一覧

7. よくあるStrong Parametersの書き方パターン一覧
7. よくあるStrong Parametersの書き方パターン一覧

ここまでの内容をもとに、よく使うパターンを一覧でおさらいしておきましょう。

パターン permitの書き方
単純な属性 .permit(:name, :email)
ネストされたハッシュ .permit(address: [:city, :zip])
配列 .permit(tags: [])
配列の中のハッシュ .permit(items: [:name, :price])
ネスト+配列+ハッシュ .permit(contacts: { phones: [:type, :number] })
関連記事:
カテゴリの一覧へ
新着記事
New1
データベース
SQLの処理が遅くなる原因とは?初心者向けにデータベースパフォーマンス最適化を完全解説
New2
Ruby
RubyのネストHash操作を徹底解説!digとtransformメソッドで複雑なデータも楽々
New3
Rails
Railsインデックス設計の極意!爆速サイトを作るためのスキーマ設計ガイド
New4
データベース
SQLのCOMMITとROLLBACKとは?トランザクション操作を初心者向けに完全解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
PATHと環境変数の正しい設定!Windows・Mac・Linux別チェックリスト付き
No.2
Java&Spring記事人気No2
Rails
Railsで日本語と時刻の設定をしよう!初心者でも安心のlocale/zone初期設定チートシート
No.3
Java&Spring記事人気No3
Ruby
Rubyのハッシュを徹底比較!シンボルキーと文字列キーの違いと使い分け
No.4
Java&Spring記事人気No4
Rails
Railsマイグレーションの型選びを完全ガイド!初心者が迷わないカラム設計
No.5
Java&Spring記事人気No5
Ruby
WindowsでRubyをインストールする方法!RubyInstallerとMSYS2を使った完全ガイド
No.6
Java&Spring記事人気No6
Rails
RailsモデルとActive Record基礎|ID戦略を完全理解!AUTO INCREMENT・UUID・ULIDの比較と導入手順
No.7
Java&Spring記事人気No7
データベース
ACID特性とは?データベーストランザクションの信頼性を初心者向けに徹底解説
No.8
Java&Spring記事人気No8
データベース
データベース正規化とは?初心者でもわかるデータ重複を防ぐSQL設計の基本