删除嵌套模型时出现的问题最小

时间:2015-01-07 22:12:27

标签: ruby-on-rails

我们说我有一个名为Project的模型,它有很多任务。每个项目都需要至少有一个任务。

class Project < ActiveRecord::Base
  has_many :tasks, dependent: :destroy
  validates :tasks, length: {minimum: 1}
  accepts_nested_attributes_for :tasks, allow_destroy: true
end

class Descripcion < ActiveRecord::Base
  belongs_to :project
end

class ProjectsController < ApplicationController
  def project_params
      params.require(:project).permit(:name, 
        :tasks_attributes => [:id, :content, :_destroy])
  end
end

当我尝试注册新项目时,验证有效,但如果我正在编辑现有项目并从中删除每项任务,则验证不会发生,并且它会发生。在没有任务的情况下保存了 我在运行此测试时发现了这个问题:

test "should not destroy tasks" do
  tasks = []
  @project.tasks.each do |t|
    tasks<< {id: t.id, _destroy: true}
  end

  assert_no_difference('Task.count') do
    patch :update, id: @project, project: { tasks_attributes: tasks}
  end
  assert_template :edit

end

我使用的是rails 4.1.0

1 个答案:

答案 0 :(得分:0)

我不完全确定在保存项目实例时validates :tasks无法运行的原因。但是,如果您通过嵌套属性通过项目保存任务......那么这样的事情应该起作用

class Project < ActiveRecord::Base
  has_many :tasks, dependent: :destroy
  accepts_nested_attributes_for :tasks, allow_destroy: true
  validate :must_have_tasks

  private
    def must_have_tasks
      errors.add(:tasks, "Project needs to have at least one task") if tasks.all? { |task| task.marked_for_destruction? }
    end
end

如果要独立于Project父级保存Task实例,则可以检查添加类似

的内容
class Task < ActiveRecord::Base
  before_destroy :not_only_task?
  belongs_to :project

  private
  def not_only_task?
    project.tasks.length > 1
  end
end