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