我在我的 Rails 模型之一中使用了accepts_nested_attributes_for,我想在创建父级后保存子级。
该表单完美运行,但验证失败。为简单起见,请想象以下内容:
class Project < ActiveRecord::Base
has_many :tasks
accepts_nested_attributes_for :tasks
end
class Task < ActiveRecord::Base
belongs_to :project
validates_presence_of :project_id
validates_associated :project
end
我正在运行:
Project.create!(
:name => 'Something',
:task_attributes => [ { :name => '123' }, { :name => '456' } ]
)
保存项目模型后,任务的验证失败,因为它们没有 project_id(因为项目尚未保存)。
Rails 似乎遵循以下模式:
- 验证项目
- 验证任务
- 保存项目
- 保存任务
模式应该是:
- 验证项目
- 通过:保存项目并继续...
- 验证任务
- 通过:保存任务
- 失败时:删除项目(可能回滚?)
所以我的问题归结为:如何让 Rails 运行 project_id=(或 project=)方法并在保存父(项目)后对子(任务)进行验证,但不保存父(项目)模型如果任何子(任务)无效?
有任何想法吗?