Rails Strong Parameters 再入門!ネスト・配列・permitを初心者向けに完全解説【form_with対応】
生徒
「Railsでフォームから送った値って、そのまま保存しちゃダメなんですか?」
先生
「Railsでは、安全のために保存していい項目を決める仕組みがあります。それがStrong Parametersです。」
生徒
「ネストとか配列って言葉を見たんですが、正直よくわからなくて…」
先生
「大丈夫です。箱に物を入れるイメージで、一つずつ丁寧に説明していきましょう。」
1. Railsの基本とStrong Parametersの立ち位置
Railsは、Webアプリを作るための仕組みが最初からたくさん用意されているフレームワークです。フレームワークとは、便利な道具箱のようなものです。Railsでは、MVCという考え方が使われています。MVCとは、Model(データ担当)、View(画面担当)、Controller(指示役)の役割分担のことです。
Strong Parametersは、この中のControllerで使われます。フォームから送られてきたデータは、必ずControllerを通ります。そのときに「このデータは使っていい」「これは使っちゃダメ」と決めるのがStrong Parametersです。これをしないと、悪意のあるデータまで保存されてしまう危険があります。
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
Strong Parametersの基本は、とてもシンプルです。requireで「必ずある箱」を指定し、permitで「保存していい項目」を指定します。現実世界で例えると、提出書類の中から必要な紙だけを抜き出すイメージです。
def user_params
params.require(:user).permit(:name, :email)
end
:userは大きな箱の名前です。:nameや:emailは、その中に入っている小さな箱です。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する基本パターン
チェックボックスなどでは、複数の値が配列として送られます。配列とは、同じ種類のデータが並んで入っている箱です。例えば、好きな色を複数選ぶ場合です。
params = {
user: {
name: "はなこ",
favorite_colors: ["red", "blue"]
}
}
配列をpermitするときは、空の配列を指定します。
def user_params
params.require(:user).permit(
:name,
favorite_colors: []
)
end
この書き方で、「中身がいくつあってもOK」という意味になります。初心者のうちは、この形をそのまま覚えて問題ありません。
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対策の関係
Railsには、CSRF対策という仕組みもあります。CSRFとは、知らないうちに不正な送信をさせられる攻撃のことです。form_withを使うと、自動で安全用の目印がフォームに入ります。
<form action="/users" method="post">
<input type="hidden" name="authenticity_token" value="ランダムな文字列">
</form>
Strong Parametersは、「送られてきた中身を選別する役」、CSRF対策は「そもそも正しい送信か確認する役」です。両方が合わさることで、Railsのフォーム入力は安全に保たれています。