###前提・実現したいこと
ひとつのformで、同一モデルの複数のレコードを作成したいです。
gemとしてcarrierwave, fogを使っていて、AWSのS3にアップロードしたいです。
newページのフォームは以下の状態です。
= form_tag action: :create do = file_field_tag 'image[]',multiple: true = text_field_tag 'address[]' = file_field_tag 'image[]',multiple: true = text_field_tag 'address[]' = submit_tag("Confirm")
またcontrollerのcreateアクション内は以下の状態です。
data_count = params[:image].count for i in 0..data_count-1 do guest = Guest.new guest.attributes = { passport_image: params[:image][i], address: params[:address][i] } guest.save end
またコントローラ内strong parameter部分はparams.require(:guest).permit(:address, :image)
としていますが、現状strong parameterを利用したcreateをしていません。(guest.create(guest_params)
のようにはしていないです。)
仮に、コントローラでnewアクション内で@guest = Guest.newのようにインスタンスを初期化しておき、
form_tagをform_for @guestとして、単一のレコードを作成する場合は正常にcreateされます。
フォームが送られる際のパラメータでは、単一レコードのフォームを送信する場合は正常にcarrierwaveが認識しているのか、画像ファイル部分に関しては#<ActionDispatch::Http::UploadedFile
というように出てきて、original_filename等がパラメータとして送られますが、配列としてform_tagで送った場合にはimage部分は、ファイル名の文字列からなる配列がパラメータとして送られてしまいます。結果的にレコードは複数作成されますが、image部分のみnilのままとなっており保存されていません。
別のgemでのアプローチがあれば別段carrierwaveを使う必要はございません。
javascriptによってユーザがform項目部分を動的に追加していける(あくまでフォームはひとつ、当然サブミットボタンも一つです。)ようにするため、コントローラのnew側であらかじめインスタンスを初期化してviewに渡すということをしていないため、form_for @guestというようにできないのが引っかかっているのかもしれません。
この機能を実現するためのアプローチについてご助言をお願いできればと思います。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/22 00:47