Rails 3 ActiveRecord :: UnknownAttributeError“未知属性:_destroy”表示嵌套记录

时间:2012-03-09 16:11:30

标签: ruby-on-rails-3 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并保存时,应该删除苹果。但是当我提交表格时,我得到了

  

AppleCrateController中的ActiveRecord :: UnknownAttributeError#update

     

未知属性:_destroy

     

...

     

“apple_crate”=&gt; {“id”=&gt;“10101”,“apples”=&gt; {“1”=&gt; {“id”=&gt;“1”,   “品种”=&gt;“格兰尼史密斯”,   “apple_crate_id”=&gt; “中10101”,   “_destroy”=&gt; “中1”},   “2”=&GT; { “ID”=&gt; “中2”,   “品种”=&gt; “中富士”,   “apple_crate_id”=&gt; “中10101”,   “_destroy”=&gt; “中1”},   “3”=&GT; { “ID”=&gt; “中3”,   “品种”=&gt; “中的Macintosh”,   “apple_crate_id”=&gt; “中10101”,   “_destroy”=&gt; “中0”},   ...

等等。

我必须错过一些明显的东西,但经过几天的充实,我无法理解。我可以成功地完成其他任务 - 更新,编辑,索引等 - 只要我省略:_destroy属性。有什么想法吗?

(对于它的价值,我在Windows上运行rails 3.2.2。)

更新:

This正是我在文档中看到的。 (参见“一对多”小节。)

更新:

根据评论中的要求,以下是观点:

<%= 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 %>

1 个答案:

答案 0 :(得分:1)

您应该使用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 %>

这样的事情,没有检查它是否正确,但想法应该足够清楚