Ошибки вложенных атрибутов Rails не распространяются - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть следующие модели:

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?

Прямо сейчас, в этой ситуации, контроллер работает так, как если бы не было никаких проблем, и обновление прошло успешно.

...