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でどのように情報が送られているかを確認すると良いだろう。