form_forで複数のレコードを一括登録する
やりたいこと。
logsテーブル(カラムは 名前、タンパク質、脂質、炭水化物、記録時間)を一つのボタンで一括登録する。
お米と牛肉など別々のlogとして登録したい場合に、一括で登録できる方が利便性が高いと考えました。
form_forのfieldにインデックスナンバー(0..10等)を入力し複数の入力フォームを作成。
indexを付与することでname値を区別して飛ばすことができます。(name値が同じだと、複数のlogのうち、最後のlogのみ保存されることになります。)
log (index=0)の卵
log(index=1)のお米
を入力し、binding.pryで止めてみる
[1] pry(#<LogsController>)> params[:log]
=> <ActionController::Parameters {"0"=>{"name"=>"卵", "protein"=>"1", "fat"=>"1", "carbohydrate"=>"2", "start_time(1i)"=>"2019", "start_time(2i)"=>"5", "start_time(3i)"=>"2", "start_time(4i)"=>"12", "start_time(5i)"=>"39"}, "1"=>{"name"=>"お米", "protein"=>"1", "fat"=>"11", "carbohydrate"=>"1", "start_time(1i)"=>"2019", "start_time(2i)"=>"5", "start_time(3i)"=>"2", "start_time(4i)"=>"08", "start_time(5i)"=>"13"}}
インデックスナンバーで区別された、入れ子構造のハッシュが飛んでいることがわかる。
params[:log][:"1"]でお米のデータが取れるため上記のようにシンボル化して値を取得できるようにする。
インデックス番号をiと定義し、params[:log][i.to_s.to_sym]がnil出ない場合に繰り返し、
保存するロジックを組む。
できた。。
結構詰まりました。fields_forとか使ってもできるのだろう、、