ЯoomeR

プログラミング~実装とエラー解決と、時々、AI~

form_withとrequireの関係[Rails]

param is missing or the value is empty

アソシエーションも組んだし、データを送る記述もしたし・・・

でもこのエラーが消えない!

データを送る際に「form_with」を使用してる場合、この記事を読めば解決できる可能性が大です。

二重ハッシュ構造が原因

form_withにおいて、modelを使用している場合、データは「二重ハッシュ構造」で送られます。

わかりやすく、modelを使用した場合、使用していない場合のデータの中身を例示します。

#modelを使用した場合(model: @hashtest)
Parameters: 
{"id"=>"1",  "hashtest"=>{"name"=>"Tarou", "email"=>"taroutarou@mail"}}

#modelを使用しない場合(urlを使用した場合など)
Parameters: 
{"id"=>"1", "name"=>"Tarou", "email"=>"taroutarou@mail"}

modelを使用した場合、ハッシュが二重になっているのがお分かりいただけるだろう。

"hashtest"=>{"name"=>"Tarou", "email"=>"taroutarou@mail"}

ビジュアル的なイメージは以下のようになる。

paramsという大きな段ボールの中に、小さなhashtestという名前の段ボールが入っている。

小さな段ボールの中に、name,emailといった情報が含まれているのだ。

情報を取り出してもらうには、どの箱に入っているかまで伝える必要がある。

箱が二重になっている時、どのような箱を開ければ良いかを伝えるのがrequireメソッドなのだ。

#二重ハッシュになっていない場合
params.permit(:name, :email)

箱を開けたらすぐに情報があるので、「params段ボール」だけ開ければよい。

#二重ハッシュになっている場合
params.require(:hashtest).permit(:name, :age)

箱の中に箱が入っているため、まずは「params段ボール」を開き、
次に「hashtest段ボール」を開くという指示が必要。

form_withはmodelを用いて記述することが多いことと思う。

「param is missing or the value is empty」が発生したときは、binding.pryでどのように情報が送られているかを確認すると良いだろう。