假设我有一个对多个属性进行操作的验证。例如,我将某个模型的“长度”存储为两个单独的整数:英尺,英寸,我想确保长度不为零,即:英尺和英尺都是非负的,至少是一个是积极的。这很容易,例如添加
errors.add_to_base('invalid length') unless (feet >= 0 and inches >= 0 and feet+inches > 0)
到我的验证方法(以及单独检查完整性和英寸< 12)。
但我想将错误与字段:inches
和:feet
相关联,以便在出现错误时,表单中的两个字段都会突出显示。现在,我唯一要做的就是两次调用errors.add()
,每个字段调用一次。但是我使用脚手架生成了这个模型,因此需要吐出两条错误消息,每次调用errors.add()
一条消息。同样在表单中我想在这两个字段旁边使用单个标签“Length”,我希望在出现错误时突出显示该标签。
我是否需要放弃脚手架来实现这一目标?怎么样?谢谢!
答案 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