Невозможно уничтожить существующую вложенную ассоциацию

У меня три модели:

class Answer < ActiveRecord::Base
  belongs_to :question
  belongs_to :profile
  belongs_to :theme
  has_many :linked_sources

  attr_accessible :body, :theme_id, :question_id, :linked_sources_attributes
  validates_presence_of :body, :profile, :question, :theme
  has_paper_trail :on => [:update]

  accepts_nested_attributes_for :linked_sources, reject_if: :all_blank
end

class Answer::LinkedSource < ActiveRecord::Base
  belongs_to :answer
  belongs_to :source

  validates :source, :description, presence: true
  validates_presence_of :answer_id, :unless => :nested
  attr_accessor :nested
  accepts_nested_attributes_for :source, reject_if: :all_blank, allow_destroy: true
end

class Source < ActiveRecord::Base
  SOURCE_TYPES = %w(book film)

  has_many :linked_sources, class_name: 'Answer::LinkedSource'
  has_many :answers, through: :linked_sources

  validates :source_type, inclusion: {in: SOURCE_TYPES}
  validates :source_type, :title, presence: true
end

У меня есть форма с двумя вложенными уже существующими связанными источниками + источниками для уже существующего ответа. В моем партиале _linked_source_fields у меня есть link_to_remove_association, и он работает правильно, устанавливая значение ввода «_destroy» на «1».

Когда я удаляю два ресурса и нажимаю кнопку отправки, я получаю следующие данные формы:

utf8:✓
_method:put
authenticity_token:726c1e7NIb0Je2uUZYeKLXmqgFHxgakfcF6fzpjFb38=
answer[theme_id]:2
answer[body]:retert
_wysihtml5_mode:1
answer[question_id]:22
answer[linked_sources_attributes][0][source_id]:3
answer[linked_sources_attributes][0][nested]:
answer[linked_sources_attributes][0][source_attributes][source_type]:book
answer[linked_sources_attributes][0][source_attributes][title]:erger
answer[linked_sources_attributes][0][source_attributes][id]:3
answer[linked_sources_attributes][0][description]:erger ter
answer[linked_sources_attributes][0][_destroy]:1
answer[linked_sources_attributes][0][id]:3
answer[linked_sources_attributes][1][source_id]:4
answer[linked_sources_attributes][1][nested]:
answer[linked_sources_attributes][1][source_attributes][source_type]:film
answer[linked_sources_attributes][1][source_attributes][title]:terter
answer[linked_sources_attributes][1][source_attributes][id]:4
answer[linked_sources_attributes][1][description]:retr
answer[linked_sources_attributes][1][_destroy]:1
answer[linked_sources_attributes][1][id]:4
commit:Готово

И вроде бы это верные данные.

Однако после сохранения этой формы оба linked_sources все еще присутствуют. Серверная сторона просто игнорирует параметры "_destroy".

Что случилось? У меня есть другая форма кокона для других моделей с более простой вложенностью (всего один уровень) в этом проекте, и она работает нормально, но в другом случае это не так.

(Как вы можете заметить, мой английский не идеален — извините за это — было бы хорошо, если бы вы это поправили)


person eXtractor    schedule 16.05.2012    source источник


Ответы (1)


Вы должны добавить allow_destroy: true к accepts_nested_attributes_for ассоциации:

accepts_nested_attributes_for :linked_sources, 
                              reject_if: :all_blank,
                              allow_destroy: true

Дополнительные сведения см. в документах.

person eXtractor    schedule 17.05.2012