Rails 3 ActiveRecord::UnknownAttributeError неизвестный атрибут: _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 и сохраняю, яблоко должно быть удалено. Но когда я отправляю форму, я получаю

ActiveRecord::UnknownAttributeError в AppleCrateController#update

неизвестный атрибут: _destroy

...

"apple_crate"=>{"id"=>"10101", "apples"=>{"1"=>{"id"=>"1", "разнообразие"=>"бабушка кузнец", "apple_crate_id"= >"10101", "_destroy"=>"1"}, "2"=>{"id"=>"2", "разнообразие"=>"fuji", "apple_crate_id"=>"10101", "_destroy "=>"1"}, "3"=>{"id"=>"3", "разнообразие"=>"macintosh", "apple_crate_id"=>"10101", "_destroy"=>"0"} , ...

и так далее.

Должно быть, я упускаю что-то очевидное, но после нескольких дней возни я не могу этого понять. Я могу успешно делать все остальное — обновлять, редактировать, индексировать и т. д. — до тех пор, пока не уберу атрибут :_destroy. Есть идеи?

(Что бы это ни стоило, я запускаю рельсы 3.2.2 в Windows.)

Обновлено:

Это то, что я рассматриваю в документация. (См. подраздел «Один ко многим».)

Обновлено:

Как просили в комментариях, вот вид:

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

person Eric deRiel    schedule 09.03.2012    source источник
comment
в соответствии с это кажется, вам нужно добавить attr_accessible :_destroy в вашу модель AppleCrate   -  person user973254    schedule 09.03.2012
comment
Спасибо за ваш комментарий. Я не уверен, зачем это нужно: _destroy не является фактическим атрибутом модели. Я думаю, что это должно быть проанализировано во время update_attributes. В любом случае, я попробовал то, что вы предложили, и получил то же сообщение об ошибке.   -  person Eric deRiel    schedule 09.03.2012
comment
Кажется, я понял, где может быть ошибка. Прикрепите код генерации формы, у вас должно быть apples_attributes вместо apples в хэше параметров   -  person user973254    schedule 09.03.2012
comment
Я попытался изменить apples[] в приведенном выше коде представления на apple_attributes[] и внес соответствующие изменения в код контроллера и получил ту же ошибку. Я могу назвать это как угодно -- asdf[] -- и получить тот же результат.   -  person Eric deRiel    schedule 09.03.2012


Ответы (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 %>

как-то так, правильность не проверял, но мысль должна быть достаточно ясна

person user973254    schedule 09.03.2012
comment
Это правильный ответ, и он более точно соответствует примеру в API. Спасибо! (Проблема, с которой я столкнулся, просто для ясности, заключалась в том, что я не понимал, что _destroy не имеет значения вне контекста родительского AppleCrate.) - person Eric deRiel; 10.03.2012