背景
我在Rails 3.2中有一个应用程序,它在HAML中的视图使用simple_form.
我有两个模型:Page和Property.页面可以包含许多属性,并且它接受属性的嵌套属性.
我想验证一个页面不能有两个具有相同名称的属性:
#app/models/page.rbclass Page < ActiveRecord::Base has_many :propertIEs accepts_nested_attributes_for :propertIEs,:allow_destroy => :trueend#app/models/property.rbclass 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指南:
The valIDation happens by performing an sql query into the model’s
table,searching for an existing record with the same value in that
attribute.
您正在创建的2 PropertIEs对象在数据库中尚不存在,因此唯一性验证无法工作.您应该尝试使用自定义验证
class Property < ActiveRecord::Base #... valIDate :name,:name_uniqueness def name_uniqueness self.page.propertIEs.select {|p| p.key == self.key}.size == 1 endend总结
以上是内存溢出为你收集整理的ruby – 验证嵌套表单中子对象的唯一性无法正常工作全部内容,希望文章能够帮你解决ruby – 验证嵌套表单中子对象的唯一性无法正常工作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)