我有以下型号:
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>
基于这些参数,它尝试破坏Task,这将触发从属的:destroy并试图破坏ContentRef。在此触发before_destroy并执行检查,并在这种情况下输入if,插入错误并中止。最后,这导致Task未被破坏,但控制器中的@course_section
没有任何错误,因此它不知道出了什么问题。另外.update
返回true,我也不明白。它不应该知道有一个异常终止并返回false吗?
现在,在这种情况下,控制器的行为就好像没有任何问题,并且更新成功。