【问题标题】:Deleting single image in array of multiple images active storage删除多个图像活动存储阵列中的单个图像
【发布时间】:2020-04-20 14:16:30
【问题描述】:

在我的编辑页面上,我显示了上传到活动存储数据库的产品的所有图像,并在其下方为该单个图像提供了一个专用的删除按钮。如果我手动插入 id,代码会删除图像,但我的代码发送的 id 给出了图像在数组中的位置。如何从数组位置编号中找到链接到图像的实际 id?

如果有更简单的方法可以做到这一点,也将不胜感激。

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

routes.rb

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

【问题讨论】:

  • 这是图像对象吗? @admin_product.images[图片]

标签: ruby-on-rails activerecord ruby-on-rails-5 rails-activestorage


【解决方案1】:

让我们从让路线不那么不稳定开始吧。

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

这将创建一个 RESTful 嵌套路由 DELETE /admin/products/:product_id/images/:id,而不是一个奇怪的 RPC 样式 delete_image_attachment 路由。如果图像 id 是唯一的,您还可以使用 shallow: true 选项来取消嵌套路由。您的路线的问题在于它包含一个 ID,但它在错误的位置。当您查看时:

products/1/delete_image_attachment

这意味着它会删除products/1 的附件。而不是 id 为 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|,然后在Ruby 中使用things[index] 获取项目。它是一种反模式,@admin_product.images.count 创建了一个完全可以避免的数据库查询。如果您需要该项目及其位置,请使用each_with_index

【讨论】:

  • 这个。 GJ max,打败我吧!最大的关键区别在于迭代图像对象,而不是像 OP 问题中的数字范围。
  • 感谢您的帖子,非常感谢。我现在收到错误“未初始化的常量 Admin::ImagesController”,我需要图像控制器吗?
  • 是的。不要在 ProductsController 中执行此操作。
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
相关资源
最近更新 更多