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

时间:2015-07-24 03:14:13

标签: ruby-on-rails ruby ruby-on-rails-4 paperclip image-uploading

Paperclip的document说要将属性设置为nil以删除附件(在我的情况下 - 照片)。

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

<%= 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 %>

这就是它的样子: enter image description here

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

电流:

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 =&gt;的id。 1到它,然后添加nil然后save

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

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

1 个答案:

答案 0 :(得分:1)

只需添加:

accepts_nested_attributes_for :project_images, allow_destroy: true
在您的project.rb

并按原样传递参数,因为您似乎正在以正确的方式执行此操作。其余的rails将处理删除或创建新记录。您不需要循环params[:photos]

希望这有帮助。