Eric deRiel
Eric deRiel

Reputation: 418

Rails 3 ActiveRecord::UnknownAttributeError "unknown attribute: _destroy" for nested records

Let's say I have a schema in which an apple crate contains zero or more apples. While editing the apple crate in a form, I want to list the apples and provide a checkbox next to each apple, for deleting it when the form is submitted.

There is nothing going wrong that I can see. In my model I say

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

I have the form working, so far as I can tell. The checkboxes appear in the form html and when the form is processed by the controller each apple in the list has an attribute called "_destroy" which is set to either "1" or "0" depending on whether or not I checked the box before submitting.

According to the Rails API, when I set _destroy to 1 and save, the apple should be deleted. But when I submit the form I get

ActiveRecord::UnknownAttributeError in AppleCrateController#update

unknown attribute: _destroy

...

"apple_crate"=>{"id"=>"10101", "apples"=>{"1"=>{"id"=>"1", "variety"=>"granny smith", "apple_crate_id"=>"10101", "_destroy"=>"1"}, "2"=>{"id"=>"2", "variety"=>"fuji", "apple_crate_id"=>"10101", "_destroy"=>"1"}, "3"=>{"id"=>"3", "variety"=>"macintosh", "apple_crate_id"=>"10101", "_destroy"=>"0"}, ...

and so on.

I must be missing something obvious but after several days of futzing around I can't figure it out. I can successfully do everything else -- update, edit, index, etc -- so long as I leave out the :_destroy attribute. Any ideas?

(For what it's worth, I'm running rails 3.2.2 on Windows.)

Updated:

This is what I'm looking at in the documentation. (See the subsection "One-to-many".)

Updated:

As requested in comments, here is the view:

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

Upvotes: 0

Views: 3784

Answers (1)

user973254
user973254

Reputation:

You should generate nested forms and forms with rails helpers, don't do it by your hands. So I think that's where your error at.

Try:

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

something like this, did not check if it's correct, but idea should be clear enough

Upvotes: 2

Related Questions