Ruby on rails 删除多个映像阵列中的单个映像活动存储器

Ruby on rails 删除多个映像阵列中的单个映像活动存储器,ruby-on-rails,activerecord,ruby-on-rails-5,rails-activestorage,Ruby On Rails,Activerecord,Ruby On Rails 5,Rails Activestorage,在我的编辑页面上,我已显示上载到active storage数据库的产品的所有图像,并在其下方显示一个用于该图像的专用删除按钮。如果我手动插入id,代码会删除图像,但代码发送的id会给出图像在数组中的位置。如何从阵列位置号找到链接到图像的实际id 如果有一个更简单的方法来做到这一点,也将不胜感激 views/admin/products/_formedit.html.erb <% (0...@admin_product.images.count).each do |image| %>

在我的编辑页面上,我已显示上载到active storage数据库的产品的所有图像,并在其下方显示一个用于该图像的专用删除按钮。如果我手动插入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 %>
routes.rb

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

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

namespace :admin do
  resources :products do
    resources :images, only: :destroy
  end
end
这将创建一个RESTful嵌套路由
DELETE/admin/products/:product\u id/images/:id
,而不是奇怪的RPC样式
DELETE\u image\u附件
路由。如果图像id是唯一的,还可以使用该选项取消嵌套路由。您的路线存在的问题是,它包含一个ID,但它位于错误的位置。当你看到:

products/1/delete_image_attachment
这意味着它将删除
产品/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\u product.images.count
创建了一个完全可以避免的数据库查询。如果您需要项目及其位置,请使用
带索引的每个\u

这是图像对象吗@admin_product.images[图像]此。GJ max,比我快!最大的关键区别是通过图像对象进行迭代,而不是像OPs问题中的数字范围。谢谢你的帖子,非常感谢。我现在收到一个错误“uninitialized constant Admin::ImagesController”,是否需要图像控制器?是。不要在ProductsController中执行此操作。
<% @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 %>