ruby – 验证嵌套表单中子对象的唯一性无法正常工作

ruby – 验证嵌套表单中子对象的唯一性无法正常工作,第1张

概述我在Rails中的作用域唯一性验证有问题.如果我尝试使用我不想重复的相同属性集创建一个具有直接在子模型中的新对象,但是当我尝试创建具有两个不唯一的子节点的父对象时,它可以正常工作没有触发. 背景 我在Rails 3.2中有一个应用程序,它在HAML中的视图使用simple_form. 我有两个模型:Page和Property.页面可以包含许多属性,并且它接受属性的嵌套属性. 我想验证一个页面不能有 我在Rails中的作用域唯一性验证有问题.如果我尝试使用我不想重复的相同属性集创建一个具有直接在子模型中的新对象,但是当我尝试创建具有两个不唯一的子节点的父对象时,它可以正常工作没有触发.

背景

我在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 – 验证嵌套表单中子对象的唯一性无法正常工作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1274240.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存