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 %>
那么,如何在控制器的更新方法中使用它来删除我的照片?
电流:
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
答案 0 :(得分:1)
只需添加:
accepts_nested_attributes_for :project_images, allow_destroy: true
在您的project.rb
中并按原样传递参数,因为您似乎正在以正确的方式执行此操作。其余的rails将处理删除或创建新记录。您不需要循环params[:photos]
。
希望这有帮助。