質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

714閲覧

【CarrierWave】複数画像をJSON型で扱う場合の更新方法について

pecchan

総合スコア587

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/09/06 11:03

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がなくともファイル名だけで更新できる方法、
関連情報など何でも結構です。

諸先輩方アドバイスお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問