Удаление одного изображения в массиве нескольких изображений активного хранилища - PullRequest
0 голосов
/ 20 апреля 2020

На моей странице редактирования я отобразил все изображения продукта, загруженные в активную базу данных хранилища, а под ним - специальную кнопку удаления для этого отдельного изображения. Код удаляет изображение, если я вручную вставляю идентификатор, но идентификатор, отправленный моим кодом, указывает местоположение изображения в массиве. Как найти фактический идентификатор, связанный с изображением, по номеру расположения массива?

Если есть более простой способ сделать это, который также будет оценен.

views / admin / products / _formedit. html .erb

<% (0...@admin_product.images.count).each do |image| %>
  <%= image_tag(@admin_product.images[image]) %>
  <%= link_to 'Remove', delete_image_attachment_admin_product_url(image), method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>

controllers / admin / products_controller.rb

def delete_image_attachment
  @image = ActiveStorage::Attachment.find(params[:id])
  @image.purge
  redirect_to contact_url
end

rout.rb

namespace :admin do
  resources :products do
    member do
      delete :delete_image_attachment
    end
  end
end

1 Ответ

1 голос
/ 20 апреля 2020

Давайте начнем с того, что маршруты станут менее шаткими.

namespace :admin do
  resources :products do
    resources :images, only: :destroy
  end
end

Это создаст вложенный маршрут RESTful DELETE /admin/products/:product_id/images/:id вместо странного маршрута delete_image_attachment в стиле RP C. Вы также можете использовать опцию shallow: true для удаления маршрута, если идентификатор изображения уникален. Проблема с вашим маршрутом заключается в том, что он содержит идентификатор, но находится не в том месте. Когда вы смотрите на:

products/1/delete_image_attachment

Это будет означать, что он удаляет вложение для products/1. И не изображение с идентификатором 1 - это то, что на самом деле происходит.

Когда ваша итерация просто повторяется по коллекции, а не по ее индексам:

<% @admin_product.images.each do |image| %>
  <%= image_tag(image) %>
  <%= link_to 'Remove', 
              admin_product_image_path(@admin_product, image), 
              method: :delete, 
              data: { confirm: 'Are you sure?' } 
  %>
<% end %>

Не выполняйте each |index| и затем получите предмет с things[index] в Ruby. Это анти-шаблон, и @admin_product.images.count создает полностью избегаемый запрос к базе данных. Если вам нужен предмет и его положение, используйте each_with_index.

...