我有一个应用程序,用户可以在其中创建一个gallery,他/她可以在其中附加一些图片。为此,我使用了载波,其结构如下。
每个gallery具有许多pictures,每个picture具有1个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

但是以某种方式未删除图片。您知道还需要添加什么,还是需要更正什么?

编辑,
正在传递的参数看起来像这样
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"}

Controller 看起来像这样
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

最佳答案

我首先要更改几件事:

1)在您的图库模型中,;后面有不必要的true

2)在您的表单中,您将在图片字段中传递p而不是builder。在您的字段中使用builder或将builder更改为p

3)在尝试更新它之前,您是否在Gallery Controller中设置了@gallery?如果未在致电@gallery之前添加此代码:@gallery = Gallery.find(params[:id])
图片 Controller 上的destroy方法可能不相关。我不认为它嵌套在另一个模型中时会通过它调用。

完成这些操作后,还请尝试更新其他内容(而不是销毁),并查看更改是否被保存。这将有助于缩小问题的范围。还要在您的控制台中查看,看是否在传递了参数哈希之后有任何错误。分享您的问题可能会有所帮助。

关于ruby-on-rails - Rails:销毁不适用于嵌套属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33250669/

10-12 17:35