Rails 3 ActiveRecord::UnknownAttribute "unknown attribute: _destroy"嵌套记录



假设我有一个模式,其中一个苹果箱包含零个或多个苹果。在表单中编辑苹果箱时,我想列出苹果,并在每个苹果旁边提供一个复选框,以便在提交表单时删除它。

我看不出有什么问题。在我的模型中,我说

class AppleCrate < ActiveRecord::Base
  has_many :apples
  accepts_nested_attributes_for :apples, :allow_destroy => true
  ...
end

据我所知,我已经把表格做好了。复选框出现在表单html中,当控制器处理表单时,列表中的每个苹果都有一个名为"_destroy"的属性,该属性设置为"1"或"0",具体取决于我在提交前是否选中了复选框。

根据Rails API,当我将_destroy设置为1并保存时,apple应该被删除。但当我提交表格时,我会收到

ActiveRecord::未知属性AppleCrateController#更新中的错误

未知属性:_存储

"apple_crace"=>{"id"=>"10101","apples"=>{"1"=>{"id"=>"1","variety"=>"史密斯奶奶","apple_crate_id"=>"10101","_destroy"=>"1"},"2"=>{"id"=>"2","品种"=>"富士","apple_crate_id"=>"10101","_destroy"=>"1"},"3"=>{"id"=>"3","variety"=>"麦金托什","apple_crate_id"=>"10101","_destroy"=>"0"},…

等等

我一定错过了一些显而易见的东西,但经过几天的摸索,我还是想不通。只要去掉:_destroy属性,我就可以成功地完成其他所有操作——更新、编辑、索引等。有什么想法吗?

(值得一提的是,我正在Windows上运行rails 3.2.2。)

更新:

这就是我在文档中看到的内容。(参见"一对多"小节。)

更新:

正如评论中所要求的,以下是观点:

<%= form_for @apple_crate do |f| %>
  <% @apples = @apple_crate.apples %>  
  <% @apples.each do |apple| %>
    <%= fields_for "apples[]", apple do |apple_fields| %>
      <%= apple_fields.text_field :variety %>
      <%= apple_fields.hidden_field :apple_crate_id %>
      <%= apple_fields.hidden_field :id %>
      <%= apple_fields.check_box :_destroy %>
    <% end %>
  <% end %>
  <%= f.submit "Save" %>
<% end %>

您应该使用rails助手生成嵌套表单和表单,而不是手动生成。所以我认为这就是你的错误所在。

尝试:

<%= form_for @apple_crate do |f| %>
  <%= f.fields_for :apples do |apple_fields| %>
    <%= apple_fields.text_field :variety %>
    <%= apple_fields.hidden_field :apple_crate_id %>
    <%= apple_fields.hidden_field :id %>
    <%= apple_fields.check_box :_destroy %>
  <% end %>
<% end %>

像这样的东西,并没有检查它是否正确,但这个想法应该足够清楚

最新更新