: зависимый =>: уничтожить не вызывает метод уничтожения до удаления? - PullRequest
3 голосов
/ 23 августа 2010

У меня есть модель заметки со следующей ассоциацией

note.rb

has_many :note_categories, :dependent => :destroy
has_many :categories, :through => :note_categories

Модель NoteCategory была создана для функционирования в качестве таблицы соединения между заметками и категориями. Изначально это была просто модель / таблица, но я создал контроллер для некоторых пользовательских вещей, когда кто-то удаляет категорию из заметки.

note_categories_controller.rb

def destroy
    p "in notes_categories_controller destroy"
    note_category_to_delete = NoteCategory.find(params[:id])
    #some custom stuff
    note_category_to_delete.destroy
    respond_to do |format|
        format.html { redirect_to(notes_url }
        format.xml  { head :ok }
    end
end

Это прекрасно работает, потому что я могу использовать эту ссылку для создания кнопки, которая удалит категорию из заметки:

<%= button_to 'Remove', note_category, :confirm => 'Are you sure?', :controller => :note_categories, :method => :delete %>

и работает нормально.

Проблема в том, что когда я удаляю заметку, строки note_category, принадлежащие заметке, удаляются, но метод уничтожения не запускается. Я знаю это, потому что пользовательский код не выполняется, и вывод терминала в первой строке не отображается в терминале. Вот вывод терминала:

Note Load (0.7ms)   SELECT * FROM "notes" WHERE ("notes"."id" = 245) 
NoteCategory Load (0.5ms)   SELECT * FROM "note_categories" WHERE ("note_categories".note_id = 245) 
NoteCategory Destroy (0.3ms)   DELETE FROM "note_categories" WHERE "id" = 146
Note Destroy (0.2ms)   DELETE FROM "notes" WHERE "id" = 245

Я подумал, что при использовании: зависимый =>: уничтожить метод destroy в контроллере NoteCategories должен быть запущен до его удаления. Что я делаю не так?

1 Ответ

4 голосов
/ 23 августа 2010

:dependent => :destroy вызовет метод уничтожения на модели , а не на контроллере .

Из документации :

Если установлено: уничтожить, все связанные объекты уничтожаются вместе с этим объектом, вызывая их метод уничтожения.

То есть, если вы хотите что-то свое для своих заметок_категории перед уничтожением, выВам придется либо переопределить метод destroy в вашей NoteCategory модель , либо использовать обратный вызов after_destroy / before_destroy.

В любом случае, использование :dependent => :destroy никогда не выполнит код, содержащийся в вашемконтроллер, поэтому вы не видите вывод оператора puts в терминале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...