У меня есть следующие модели:
class CourseSection < ApplicationRecord
has_many :tasks, through: :content_refs, source: :content, source_type: "Task"
...
end
class ContentRef < ApplicationRecord
before_destroy do
if task_completions.any?
errors.add(:content_ref, "has associated task completions and can't be deleted. Try archiving it instead.")
course_section.errors.add(:content_ref, "has associated task completions and can't be deleted. Try archiving it instead.")
throw(:abort)
end
end
belongs_to :course_section
has_one :task, :through => :self_ref, :source => :content, :source_type => 'Task'
...
end
class Task < ApplicationRecord
has_many :referring_content_refs, as: :content, dependent: :destroy, class_name: "ContentRef"
...
end
Я управляю задачами через вложенные атрибуты в CourseSectionsController следующим образом:
@course_section.update update_attributes_params
, где update_attributes_params равно
<ActionController::Parameters {"tasks_attributes"=>{"0"=>{"title"=>"Task", "id"=>"6", "_destroy"=>"1"}}} permitted: true>
Основываясь на этих параметрах, он пытается уничтожить задачу, которая вызывает зависимое:: destroy и пытается уничтожить ContentRef.Там before_destroy срабатывает, выполняет проверку и (в этом случае) вводит if, вставляет ошибки и прерывает работу.В итоге это приводит к тому, что Задача не будет уничтожена так, как я хочу, но @course_section
в контроллере не имеет ошибок, поэтому он не знает, что что-то пошло не так.Также .update
возвращает true, чего я тоже не понимаю.Разве он не должен знать, что произошел прерывание и возврат false?
Прямо сейчас, в этой ситуации, контроллер работает так, как если бы не было никаких проблем, и обновление прошло успешно.