假设我有一个模式,其中一个苹果箱包含零个或多个苹果。在表单中编辑苹果箱时,我想列出苹果,并在每个苹果旁边提供一个复选框,以便在提交表单时删除它。
我看不出有什么问题。在我的模型中,我说
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 %>
像这样的东西,并没有检查它是否正确,但这个想法应该足够清楚