【问题标题】:accepts_nested_attributes_for - Preventing destroy on primary model?Accepts_nested_attributes_for - 防止破坏主模型?
【发布时间】:2012-01-02 20:41:15
【问题描述】:

我有一个包含画廊模型和资产模型的照片库。见下文:

class Gallery < ActiveRecord::Base
  attr_accessible :gallery_name, :description, :assets_attributes 
  has_many :assets, :dependent => :destroy
  accepts_nested_attributes_for :assets, :allow_destroy => true

  def find_featured_image
    assets.featured
  end

  def find_only_featured
   assets.only_featured
  end


class Asset < ActiveRecord::Base
  belongs_to :gallery

  has_attached_file :image,
    :styles => {
      :thumb => '150x150#',
      :medium => '300x300>',
      :large => '600x600>'
    }

  def self.featured
    where( :featured => true ).limit(1)
  end

  scope :only_featured, where(:featured => true)

end
end

我可以通过我的 Gallery 表单销毁资产,但是当我尝试销毁 Gallery 本身时,我只是被重定向到 Show 视图而没有确认通知。

这是我的表格:

<div id="gallery">
    <div class="headers"><h1>MDN Photo Gallery</h1></div></br>

    <% @galleries.each do |gallery| %>

    <div id="gallery_wrap">
        <div id="gallery_left">
            <div id="gallery_head"><h2><%= gallery.gallery_name %></h2></div>
            <div id="gallery_desc"><%= gallery.description %></div>
        </div>
        <div id="gallery_rt">
            <div id="gallery_featured">
                <% for asset in gallery.assets.featured %>
                  <%= link_to( image_tag(asset.image.url(:medium)), asset.image.url(:large), :class => "fancybox", :rel => gallery.id ) %>
                <% end %>
            </div>
            <div id="gallery_photos">   
            <% for asset in gallery.assets %>   
              <%= link_to( image_tag(asset.image.url(:thumb)), asset.image.url(:large), :class => "fancybox", :rel => gallery.id ) %>
            <% end %>   
            </div>
            <td><%= link_to 'Show', gallery %></td>
            <td><%= link_to 'Edit', edit_gallery_path(gallery) %></td>
            <td><%= link_to 'Destroy', gallery, :confirm => 'Are you sure?', :method => :delete %></td>
        </div>
    </div>
    </br>
    <% end %>
    <br />
<%= link_to 'New Gallery', new_gallery_path %>
</div>

我正在使用通过脚手架创建的标准销毁方法:

def destroy
@gallery = Gallery.find(params[:id])
@gallery.destroy

respond_to do |format|
  format.html { redirect_to(galleries_url) }
  format.xml  { head :ok }
end

我需要对模型进行一些更改吗?销毁方法?还要别的吗?为了能够删除嵌套模型的父级?

提前感谢您的见解。 有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails models nested-attributes


    【解决方案1】:

    听起来 JavaScript 支持的加载方式有问题。没有办法让锚点直接发出 DELETE 请求,因此 Rails 使用 JavaScript 响应链接的单击事件,然后发出正确的请求。没有它,链接只是充当 GET。

    【讨论】:

    • 你碰巧知道 rails 中的哪个 .js 库对此负责吗?或许javascripts的加载顺序与此有关。
    • 您使用的是哪个版本的 Rails?如果在 3.1 之前,您是否安装了 jQuery 支持,或者您是否使用默认的 Prototype 支持?
    • 我使用的是 v3.0.3。我不熟悉需要安装 JQuery 支持。我将 JQuery 添加到默认的原型支持中。你有链接可以参考我吗?谢谢!
    【解决方案2】:

    我在另一个网站上发现了这个讨论,它准确地描述了我所面临的情况:

    http://railsforum.com/viewtopic.php?id=38460

    建议使用 button_to 而不是标准的 link_to 以防止网络爬虫。我以前没有听说过。

    还观察到 的缺失,原始问题消失了,link_to 工作。对我来说不是这样。

    所以现在我有一个 button_for 并且能够销毁记录。但是,我没有收到确认通知 (:confirm)。所以还是有问题,但我至少可以处理删除记录的需要。

    【讨论】:

      【解决方案3】:

      我现在可以让确认通知正常工作 (:confirm)。我所做的是将 javascript_include_tag :defaults 更改为 javascript_include_tag :all。我忘记了我做了那个改变。我不确定调用 :defaults 方法时包含什么,但只是想让其他遇到此问题的人知道我是如何修复它的。听起来使用 Button_to 而不是 Link_to 仍然是最好的解决方案,即使 link_to 现在可以工作。

      【讨论】:

        猜你喜欢
        • 2015-01-12
        • 1970-01-01
        • 2012-06-12
        • 2014-01-01
        • 2014-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多