小さなエンドウ豆

まだまだいろいろ勉強中

Active Storage で複数枚画像を削除する方法

ActiveStorage で画像を複数枚削除する方法

Rails 5.2 で Active Storage が gem 使わずとも添付ファイルが実装できるため使用している。
Rails ガイド を見ると1つのオブジェクトに対して複数の画像を添付することができる has_many_attached という機能がある。
これは非常に便利なのだが削除に関しては、has_one_attached の場合(オブジェクトに対して1つの添付ファイルがある場合)のみしか記されていなかったため、ここに残しておく。

添付ファイルが1つの場合の削除

ガイドを見ると以下のように記されている。

# 物理削除
@user.avatar.purge

複数添付ファイルを削除する

以下のように書くとできた。
改めて見ると直感的にかけそうでした…

まずは view 。 アルバムというモデルの更新画面があるとするとこんな感じです。

<%= form_with model: @album, local: true  do |form| %>
    <p>現在登録されている画像(削除するものはチェックしてください)</p>
    <% @album.images.each do |image| %>
      <%= form.check_box :image_ids, {:multiple => true}, image.id, false %>
      <%= image_tag image, :size=>"100x100" %> <br>
    <% end %>
  <% end %>
  <%= form.submit %>

これにより params[:album][:image_ids] に削除するファイルの ID が入る。

次に controller 側。 送られてきた ID のファイルを1つずつ削除しておくだけ。

params[:album][:image_ids].each do |image_id|
  image = @album.images.find(image_id)
  image.purge
end

参考

www.nicholasshirley.com