カテゴリ: Rails 更新日: 2026/02/08

Rails Strong Parameters 再入門!ネスト・配列・permitを初心者向けに完全解説【form_with対応】

Strong Parameters再入門:ネスト・配列・permit のレシピ集【実例多数】
Strong Parameters再入門:ネスト・配列・permit のレシピ集【実例多数】

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

生徒

「Railsでフォームから送った値って、そのまま保存しちゃダメなんですか?」

先生

「Railsでは、安全のために保存していい項目を決める仕組みがあります。それがStrong Parametersです。」

生徒

「ネストとか配列って言葉を見たんですが、正直よくわからなくて…」

先生

「大丈夫です。箱に物を入れるイメージで、一つずつ丁寧に説明していきましょう。」

1. Railsの基本とStrong Parametersの立ち位置

1. Railsの基本とStrong Parametersの立ち位置
1. Railsの基本とStrong Parametersの立ち位置

Railsは、Webアプリを作るための仕組みが最初からたくさん用意されているフレームワークです。フレームワークとは、便利な道具箱のようなものです。Railsでは、MVCという考え方が使われています。MVCとは、Model(データ担当)、View(画面担当)、Controller(指示役)の役割分担のことです。

Strong Parametersは、この中のControllerで使われます。フォームから送られてきたデータは、必ずControllerを通ります。そのときに「このデータは使っていい」「これは使っちゃダメ」と決めるのがStrong Parametersです。これをしないと、悪意のあるデータまで保存されてしまう危険があります。

2. form_withとパラメータの基本構造

2. form_withとパラメータの基本構造
2. form_withとパラメータの基本構造

Railsで入力フォームを作るときによく使うのがform_withです。フォームとは、名前やメールアドレスを入力する箱の集まりだと思ってください。入力して送信すると、その中身がControllerに送られます。この送られたデータをパラメータと呼びます。


# controllerで受け取るparamsのイメージ
params = {
  user: {
    name: "たろう",
    email: "taro@example.com"
  }
}

このように、Railsではモデル名(ここではuser)が大きな箱になり、その中にnameやemailが入っています。これをネストと呼びます。入れ子構造、つまり箱の中に箱がある状態です。

3. Strong Parametersの基本:requireとpermit

3. Strong Parametersの基本:requireとpermit
3. Strong Parametersの基本:requireとpermit

Strong Parametersの基本は、とてもシンプルです。requireで「必ずある箱」を指定し、permitで「保存していい項目」を指定します。現実世界で例えると、提出書類の中から必要な紙だけを抜き出すイメージです。


def user_params
  params.require(:user).permit(:name, :email)
end

:userは大きな箱の名前です。:name:emailは、その中に入っている小さな箱です。permitに書いていないものは、たとえ送られてきても無視されます。これがセキュリティを守る理由です。

4. ネストしたデータをpermitする方法

4. ネストしたデータをpermitする方法
4. ネストしたデータをpermitする方法

次は、もう一段深いネストです。例えば、ユーザーが住所も入力する場合を考えます。住所は、都道府県や市区町村など、さらに情報が分かれます。


params = {
  user: {
    name: "たろう",
    address: {
      city: "東京",
      street: "1-2-3"
    }
  }
}

この場合、permitは次のように書きます。


def user_params
  params.require(:user).permit(
    :name,
    address: [:city, :street]
  )
end

addressの中にも箱があるので、配列の形で許可する項目を書きます。箱の中身をそのまま書き出す感覚で大丈夫です。

5. 配列データをpermitする基本パターン

5. 配列データをpermitする基本パターン
5. 配列データをpermitする基本パターン

チェックボックスなどでは、複数の値が配列として送られます。配列とは、同じ種類のデータが並んで入っている箱です。例えば、好きな色を複数選ぶ場合です。


params = {
  user: {
    name: "はなこ",
    favorite_colors: ["red", "blue"]
  }
}

配列をpermitするときは、空の配列を指定します。


def user_params
  params.require(:user).permit(
    :name,
    favorite_colors: []
  )
end

この書き方で、「中身がいくつあってもOK」という意味になります。初心者のうちは、この形をそのまま覚えて問題ありません。

6. 配列+ネストの実践レシピ

6. 配列+ネストの実践レシピ
6. 配列+ネストの実践レシピ

少しだけ応用です。例えば、ユーザーが複数の連絡先を持つ場合を考えます。電話番号がいくつも登録できるようなケースです。


params = {
  user: {
    name: "けん",
    phones: [
      { number: "090-1111-2222" },
      { number: "080-3333-4444" }
    ]
  }
}

この場合のpermitは、次のようになります。


def user_params
  params.require(:user).permit(
    :name,
    phones: [:number]
  )
end

配列の中にさらに箱がある構造です。「配列だから[]」「中の項目は:number」という順番で考えると混乱しにくくなります。

7. Strong ParametersとCSRF対策の関係

7. Strong ParametersとCSRF対策の関係
7. Strong ParametersとCSRF対策の関係

Railsには、CSRF対策という仕組みもあります。CSRFとは、知らないうちに不正な送信をさせられる攻撃のことです。form_withを使うと、自動で安全用の目印がフォームに入ります。


<form action="/users" method="post">
  <input type="hidden" name="authenticity_token" value="ランダムな文字列">
</form>

Strong Parametersは、「送られてきた中身を選別する役」、CSRF対策は「そもそも正しい送信か確認する役」です。両方が合わさることで、Railsのフォーム入力は安全に保たれています。

カテゴリの一覧へ
新着記事
New1
Ruby
“すべてはオブジェクト”を体感!初心者向けRubyのオブジェクト指向入門【irbで学ぶ】
New2
Ruby
Rubyの標準入出力を完全ガイド!puts・print・pの違いとデバッグ活用法
New3
Ruby
Gemとは?RubyGemsとBundlerを初心者向けに完全解説!依存関係管理も図解でわかりやすく理解
New4
Ruby
Rubyの文字エンコーディング入門!UTF-8・マジックコメント・外部/内部エンコーディングを完全解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.3
Java&Spring記事人気No3
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.4
Java&Spring記事人気No4
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.5
Java&Spring記事人気No5
Ruby
Rubyのfind/detect/find_indexを徹底解説!目的のデータを素早く探す方法
No.6
Java&Spring記事人気No6
Ruby
Rubyのselect/reject/filterの使い方を完全解説!初心者向けの条件抽出レシピ
No.7
Java&Spring記事人気No7
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け
No.8
Java&Spring記事人気No8
データベース
PostgreSQLで順位付け!ROW_NUMBER関数の使い方を初心者向けに徹底解説