rails5.2
carrierwave2.1.0
「CarrierWave 複数画像」と調べると、画像の情報を保持するためのImagesテーブルを作って、has_many :imagesとする方法が多いですが、CarrierWaveバージョン1.0.0から複数画像は公式でサポートされており、上記の方法よりかなり簡潔に実装することが可能になっているとのことでJSON型で実装しました。
実際、登録はすぐに出来ましたが、更新画面(画像の更新)で行き詰まりました。
更新のロジックで
「どの画像が変更(削除)されたか」を確認するため、
ブラウザ上の画像とDB上の画像を比較する必要があります。
その比較に、「has_many :images」型を採用している場合は、
以下のようにidで比較出来ますが、
ruby
1class Product < ApplicationRecord 2 has_many :images, dependent: :destroy 3 accepts_nested_attributes_for :images 4end 5 6 7class Image < ApplicationRecord 8 mount_uploader :image, ImageUploader 9 belongs_to :product 10end
ruby
1if params[:product].keys.include?("image") 2 # dbにある画像がedit画面で一部削除してるか確認 3 update_images_ids = params[:product][:image].values #投稿済み画像の残り 4 before_images_ids = @product.images.ids 5 # 商品に紐づく投稿済み画像が、投稿済みにない場合は削除する 6 # before_images_ids.each do doで、一つずつimageハッシュにあるか確認。なければdestroy 7 before_images_ids.each do |before_img_id| 8 Image.find(before_img_id).destroy unless update_image_ids.include?("#{before_img_id}") 9 end 10 else 11 # imageハッシュがない = 投稿済みの画像をすべてedit画面で消しているので、商品に紐づく投稿済み画像を削除する。 12 # @product.images.destroy = nil と削除されないので、each do で一つずつ削除する 13 before_images_ids.each do |before_img_id| 14 Image.find(before_img_id).destroy 15 end 16 end
JSON型では、1つカラムに[aaa.jpg][bbb.jpg][ccc.jpg]
という風に、配列としてファイル名が入るだけです。
そのため直接ファイル名をidとして採番しようかと試みましたが、js側からファイル名は変更できないため断念しました。
調べましたが「JSON」型でなく「has_many :images」型の情報ばかりでした。
どなたか「JSON型を採用しつつ更新も実装」された方居ましたら情報いただけないでしょうか?
あるいは、idがなくともファイル名だけで更新できる方法、
関連情報など何でも結構です。
諸先輩方アドバイスお願いします。
あなたの回答
tips
プレビュー