ActiveStorage - Select 个要删除的图像
ActiveStorage - Select Images to Delete
我有一个表单,用户可以在其中查看上传的图片,也可以一次删除一张。但我想要的是在每个图像旁边都有复选框,这样用户就可以 select 他想要删除的图像,然后按一个按钮将它们删除。
现在这是我拥有的:
_form.html.erb
<% if @vehicle.images.attached? %>
<% @vehicle.images.each do |img| %>
<div class="box_image">
<div class="box_content">
<%= image_tag img %>
<div class="overlay">
<%= link_to delete_upload_vehicle_url(@vehicle, img.id), method: :delete, data: { confirm_swal: 'Tem a certeza que quer eliminar esta imagem?' }, class:"delete_image" do %>
<i class="fa fa-times"></i>
<% end %>
</div>
</div>
</div>
<% end %>
<% end %>
vehicles_controller.rb
def delete_upload
attachment = ActiveStorage::Attachment.find(params[:upload_id])
attachment.purge
redirect_back(fallback_location: vehicles_path)
end
routes.rb
resources :vehicles do
member do
delete "delete_upload/:upload_id", action: :delete_upload, as: :delete_upload
end
end
图片
我怎样才能完成我想要的?如果有人能给我一个例子,我将不胜感激:)
在您看来,您需要为每张图片定义一个复选框,该复选框可以通过单击按钮提交的表单进行选择
<%= form_tag destroy_multiple_images_path, method: :delete do %>
<% if @vehicle.images.attached? %>
<% @vehicle.images.each do |img| %>
<div class="box_image">
<div class="box_content">
<%= image_tag img %>
<%= check_box_tag "deleted_img_ids[]", img.id %>
</div>
</div>
<% end %>
<% end %>
<%= submit_tag "Delete selected" %>
<% end %>
在您的控制器中,您可以执行以下操作:
vehicles_controller.rb:
def destroy_multiple
attachments = ActiveStorage::Attachment.where(id: params[:deleted_img_ids])
attachments.map(&:purge)
end
有任何疑问欢迎提问
我最终以不同的方式做事,但非常感谢@Sandepp Garg 帮助我实现了目标。
因为 rails 不支持另一个表单中的表单,所以我无法使用 Sandepp 的答案。我使用我的更新操作来删除图像。我不知道这是否是最好的方法,但我就是这样做的。
#controller
def update
attachments = ActiveStorage::Attachment.where(id: params[:deleted_img_ids])
attachments.map(&:purge)
if @vehicle.update(vehicle_params)
redirect_to @vehicle
else
render 'edit'
end
end
<!-- view -->
<div class="box_image">
<div class="box_content">
<%= image_tag img %>
<%= check_box_tag "deleted_img_ids[]", img.id %>
</div>
</div>
如果我确实做错了什么,请告诉我。谢谢:)
我有一个表单,用户可以在其中查看上传的图片,也可以一次删除一张。但我想要的是在每个图像旁边都有复选框,这样用户就可以 select 他想要删除的图像,然后按一个按钮将它们删除。
现在这是我拥有的:
_form.html.erb
<% if @vehicle.images.attached? %>
<% @vehicle.images.each do |img| %>
<div class="box_image">
<div class="box_content">
<%= image_tag img %>
<div class="overlay">
<%= link_to delete_upload_vehicle_url(@vehicle, img.id), method: :delete, data: { confirm_swal: 'Tem a certeza que quer eliminar esta imagem?' }, class:"delete_image" do %>
<i class="fa fa-times"></i>
<% end %>
</div>
</div>
</div>
<% end %>
<% end %>
vehicles_controller.rb
def delete_upload
attachment = ActiveStorage::Attachment.find(params[:upload_id])
attachment.purge
redirect_back(fallback_location: vehicles_path)
end
routes.rb
resources :vehicles do
member do
delete "delete_upload/:upload_id", action: :delete_upload, as: :delete_upload
end
end
图片
我怎样才能完成我想要的?如果有人能给我一个例子,我将不胜感激:)
在您看来,您需要为每张图片定义一个复选框,该复选框可以通过单击按钮提交的表单进行选择
<%= form_tag destroy_multiple_images_path, method: :delete do %>
<% if @vehicle.images.attached? %>
<% @vehicle.images.each do |img| %>
<div class="box_image">
<div class="box_content">
<%= image_tag img %>
<%= check_box_tag "deleted_img_ids[]", img.id %>
</div>
</div>
<% end %>
<% end %>
<%= submit_tag "Delete selected" %>
<% end %>
在您的控制器中,您可以执行以下操作:
vehicles_controller.rb:
def destroy_multiple
attachments = ActiveStorage::Attachment.where(id: params[:deleted_img_ids])
attachments.map(&:purge)
end
有任何疑问欢迎提问
我最终以不同的方式做事,但非常感谢@Sandepp Garg 帮助我实现了目标。
因为 rails 不支持另一个表单中的表单,所以我无法使用 Sandepp 的答案。我使用我的更新操作来删除图像。我不知道这是否是最好的方法,但我就是这样做的。
#controller
def update
attachments = ActiveStorage::Attachment.where(id: params[:deleted_img_ids])
attachments.map(&:purge)
if @vehicle.update(vehicle_params)
redirect_to @vehicle
else
render 'edit'
end
end
<!-- view -->
<div class="box_image">
<div class="box_content">
<%= image_tag img %>
<%= check_box_tag "deleted_img_ids[]", img.id %>
</div>
</div>
如果我确实做错了什么,请告诉我。谢谢:)