Rails复杂表单验证?
我的工作模型有一个复杂的表单。它接受信用,图像和视频的嵌套属性。 (它是埃洛伊Duran的复杂形式示例的修改版本)Rails复杂表单验证?
- 我想验证的至少一个信用的存在
- 我想验证的至少一个图像或一个的存在视频
当我这样做(在work.rb):
validates_presence_of :credits
它验证正确,当我尝试提交形式,无任何信用,但如果我删除最后一个信用它不验证(通过checki在信用的属性中加入“_delete”的check_box)。它提交工作,删除离开工作的唯一信用,没有任何信用。
你对我如何正确验证它们有任何想法吗?
你需要的是沿着线的东西:
validate :credits_present
private
def credits_present
unless credits.any?{|c| !c.marked_for_destruction? }
errors.add_to_base "You must provide at least one credit"
end
end
有条件在credits_present
可能有点乱,所以让我打破它,以防万一你不遵守。 any?
方法返回true
如果Enumerable
中的任何项目对所提供的块做出响应。在这种情况下,我们检查该项目不会被删除。所以,如果任何信用不会被删除,我们得到true
。如果true
,我们状态良好,我们至少有一个信用点不会被删除。另一方面,如果我们得到false
,我们要么知道没有任何信用或者存在的任何信用都将被删除。在这种情况下,验证失败,我们添加错误。
尝试在work.rb
before_save :check_credits
private
def check_credits
self.credits > 0
end
使用before_save如果学分< =零,保存也不会去。
不,这是行不通的。我认为问题在于,由于信用被标记为删除,并且在保存之前将隐藏复选框值设置为1,所以信用仍然存在,直到保存完成。那么self.credits.size> 0或self.credits.blank?不会做这项工作。如果我可以访问已提交信用的_delete参数,我可以停止保存,但我无法找到从模型中访问该属性的方法。 – fahrio 2009-10-05 23:31:48
fahrio是完全正确的问题。 – 2009-10-06 00:51:06
谢谢彼得,marked_for_destruction是我正在寻找,但任何?你使用的方法太棒了。 – fahrio 2009-10-06 08:18:14
酷,很好的工作彼得。 – klochner 2009-10-06 16:39:51