我们说我有一个名为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
答案 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