Ruby Rails:更新时删除回形针中的多个附件

Ruby on Rails: Deleting multiple attachments in paperclip on updates

Paperclip 的 document 说要将属性设置为 nil 以删除附件(在我的例子中是照片)。

我希望用户能够编辑他们的项目,并删除他们附加的照片。当他们准备好删除照片时,他们会点击 "Update" 按钮,因为他们正在编辑项目,而不仅仅是删除照片。我使用复选框是因为每个项目可以包含多张照片:

<%= simple_form_for @project, html: { multipart: true } do |f| %>
  <% @project.project_images.each do |pic| %> 
    <%= f.simple_fields_for :project_images, pic do |image_fields| %>
      <%= image_tag pic.photo.url(:thumb) %>
      <%= image_fields.check_box :_destroy %>
    <% end %>
  <% end %>
  <%= f.button :submit %>
<% end %>

这是它的样子:

那么,如何使用它在控制器的更新方法中删除我的照片?

当前:

def update
  @project = current_user.projects.find(params[:id])
  respond_to do |format|
    if @project.update(project_params)
      if params[:photos]
        params[:photos].each { |image|
          @project.project_images.create(photo: image)
        }
      end       
    end
  end
end

您可以看到,如果用户决定这样做,我仍在将新图像创建到数据库中。

在我的日志中,我得到了这个

"project_images_attributes"=>{
            "0"=>{"_destroy"=>"0", "id"=>"25"}, 
            "1"=>{"_destroy"=>"1", "id"=>"26"}, 
            "2"=>{"_destroy"=>"1", "id"=>"27"}}

这表明我确实勾选了要删除的照片 ID 的 26 和 27。所以现在,我只想知道如何将其传递给我的更新方法以进行销毁?我将不得不循环遍历它,检查具有 _destroy => 1 的 ID,然后添加 nil 然后添加 save?

最后,我的项目参数(包括 :_destroy

def project_params
  params.require(:project).permit(
    project_images_attributes: [:id, :project_id, :photo, :_destroy])
end

只需添加:

accepts_nested_attributes_for :project_images, allow_destroy: true

在您的 project.rb 中并按原样传递参数,因为看起来您的做法是正确的。其余 rails 将处理删除或创建新记录。您不需要在 params[:photos].

上循环

希望对您有所帮助。