ruby – 验证嵌套表单中子对象的唯一性无法正常工作
我在Rails中的作用域唯一性验证有问题.如果我尝试使用我不想重复的相同属性集创建一个具有直接在子模型中的新对象,但是当我尝试创建具有两个不唯一的子节点的父对象时,它可以正常工作没有触发.
背景 我在Rails 3.2中有一个应用程序,它在HAML中的视图使用simple_form. 我有两个模型:Page和Property.页面可以包含许多属性,并且它接受属性的嵌套属性. 我想验证一个页面不能有两个具有相同名称的属性: #app/models/page.rb class Page < ActiveRecord::Base has_many :properties accepts_nested_attributes_for :properties,:allow_destroy => :true end #app/models/property.rb class Property < ActiveRecord::Base belongs_to :page VALID_PROPERTIES = %w(id text name xpath class css) validates :name,:inclusion => VALID_PROPERTIES,:uniqueness => {:scope => :page_id} end 当然,该属性具有page_id属性. 就像我说的,当通过其表单创建一个新属性时,验证工作.如果我尝试创建一个具有相同名称和相同page_id的新属性,Rails会告诉我该名称已被删除. 问题 如果我创建一个新页面,并通过嵌套表单,分配各种属性,我可以绕过此验证.当数据库中尚未存在page_id和property_id的组合时,这似乎只是一个问题,例如,如果我编辑已保存属性的Page模型,并且我尝试添加一个新的一个相同的名称,验证现在触发. 解决方法
我会试试
validates_associated :
class Page < ActiveRecord::Base has_many :properties accepts_nested_attributes_for :properties,:allow_destroy => :true validates_associated :properties end 更新 有关验证状态的Rails指南:
您正在创建的2 Properties对象在数据库中尚不存在,因此唯一性验证无法工作.您应该尝试使用自定义验证 class Property < ActiveRecord::Base #... validate :name,:name_uniqueness def name_uniqueness self.page.properties.select {|p| p.key == self.key}.size == 1 end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |