我有一个应用程序,用户可以创建一个gallery
,他/她可以附加一些图片。我为此目的使用了carrierwave,其结构如下。
每个gallery
都有多个pictures
,每个picture
都有一个image
。
class Gallery < ActiveRecord::Base
has_many :pictures, dependent: :destroy
accepts_nested_attributes_for :pictures, allow_destroy: true;
end
class Picture < ActiveRecord::Base
belongs_to :gallery
mount_uploader :image, ImageUploader
end
以下列方式上传和编辑图库和图片
<ul>
<%= f.fields_for :pictures do |builder| %>
<li class="clearfix fields">
<% if p.object.image.length > 1 %>
<%= image_tag(p.object.image) %>
<% end %>
<%= p.file_field :image %>
<%= p.text_field :title %>
<% if p.object.image.length > 1 %>
<br />
<%= p.hidden_field :_destroy %>
<a href="#" class="delete-link">Remove picture</a>
<% end %>
</li>
<% end %>
</ul>
点击delete-link
后,_destroy
字段值设置为true
(使用javascript)。这很好用。我还在我的强参数中允许_destroy
属性,我看到它被传递给GalleriesController
。
def gallery_params
params.require(:gallery).permit(:title, :synopsis, :thumb, pictures_attributes: [:image, :title, :id, :_destroy])
end
但不知何故,图片没有被删除。知道还需要添加什么,或需要纠正什么?
EDIT, 正在传递的参数看起来像这样
Parameters: {"utf8"=>"✓", "authenticity_token"=>"lTad77QCH7hDcSaKm0EFI90KhY+nVwNS4jRNADC7DSR1ATxszDwlHefWNyNEdVqdqpuvEh9PkBFnoPIfnp9JKw==", "gallery"=>{"title"=>"new one", "synopsis"=>"ssfjalsdj;fk", "pictures_attributes"=>{"0"=>{"title"=>"portfolio", "_destroy"=>"true", "id"=>"4"}, "1"=>{"title"=>""}}, "thumb_cache"=>""}, "commit"=>"Update Gallery", "id"=>"2"}
控制器看起来像这样
class GalleriesController < ApplicationController
def update
@gallery.update(gallery_params)
redirect_to(gallery_path(@gallery))
end
end
class PicturesController < ApplicationController
def destroy
@picture = Picture.find(params[:id])
@picture.destroy
end
end
答案 0 :(得分:0)
我首先会改变一些事情:
1)在您的图库模型中,;
之后有一个不必要的true
。
2)在您的表单中,您在照片字段中传递p
而不是builder
。在您的字段中使用builder
或将builder
更改为p
。
3)在您的Gallery Controller中,您是否在尝试更新之前设置了@gallery?如果在您致电更新@gallery:@gallery = Gallery.find(params[:id])
图片控制器上的破坏方法可能没有关系。当它嵌套在另一个模型中时,我认为它不会被调用。
执行这些操作后,还要尝试更新其他内容(不要销毁)并查看更改是否已保存。这将有助于缩小问题范围。还要查看控制台,看看传递参数哈希后是否有任何错误。在你的问题中分享那些可能有所帮助。