将验证错误与多个字段相关联

时间:2011-01-20 23:22:35

标签: ruby-on-rails ruby-on-rails-3

假设我有一个对多个属性进行操作的验证。例如,我将某个模型的“长度”存储为两个单独的整数:英尺,英寸,我想确保长度不为零,即:英尺和英尺都是非负的,至少是一个是积极的。这很容易,例如添加

errors.add_to_base('invalid length') unless (feet >= 0 and inches >= 0 and feet+inches > 0)

到我的验证方法(以及单独检查完整性和英寸< 12)。

但我想将错误与字段:inches:feet相关联,以便在出现错误时,表单中的两个字段都会突出显示。现在,我唯一要做的就是两次调用errors.add(),每个字段调用一次。但是我使用脚手架生成了这个模型,因此需要吐出两条错误消息,每次调用errors.add()一条消息。同样在表单中我想在这两个字段旁边使用单个标签“Length”,我希望在出现错误时突出显示该标签。

我是否需要放弃脚手架来实现这一目标?怎么样?谢谢!

2 个答案:

答案 0 :(得分:3)

处理此问题的一种方法是创建一个名为“length”的虚拟属性,并在其上设置错误而不是在组件字段上。换句话说,创建一个自定义验证,检查各种错误条件,构建一个字符串(如果有多个错误),然后将字符串添加到errors[:length]。表单需要在与“feet”和“inches”字段可视地关联的位置显示length属性的内联错误。显然你需要放弃脚手架才能做到这一点。

Railscasts episode 16中有虚拟属性的教程,现在有点陈旧(2007年!),但仍然可以观看。想象一下它是一部经典的黑白电影......

答案 1 :(得分:0)

您可以在新标签上设置错误,然后在视图中嵌套标签。这使您可以单独突出显示每个字段(单独的错误消息)或两者一起突出显示(单个错误消息)。

在您的模型中,您实际上不必创建相应的虚拟属性。您可以像这样设置错误:

errors.add(:length, 'invalid length'    ) unless (feet >= 0 && inches >= 0)
errors.add(:inches, 'too big'           ) unless (inches < 12)
errors.add(:feet,   'cannot be negative') unless (feet < 0)

然后,在视图中嵌套标签:

- # (This is Haml.  If you use erb, I'm sure you can figure it out!)
= f.label :length do
  = f.label feet, "Feet:"
= f.text_field :feet

= f.label :length do
  = f.label inches, "Inches:"
= f.text_field :inches

免责声明:我实际上没有测试过这段代码,但我的代码库中有一些非常相似的东西。这是使用rails 3.1.11