2009-10-05 123 views
0

我的工作模型有一个复杂的表单。它接受信用,图像和视频的嵌套属性。 (它是埃洛伊Duran的复杂形式示例的修改版本)Rails复杂表单验证?

  • 我想验证的至少一个信用的存在
  • 我想验证的至少一个图像或一个的存在视频

当我这样做(在work.rb):

validates_presence_of :credits 

它验证正确,当我尝试提交形式,无任何信用,但如果我删除最后一个信用它不验证(通过checki在信用的属性中加入“_delete”的check_box)。它提交工作,删除离开工作的唯一信用,没有任何信用。

你对我如何正确验证它们有任何想法吗?

回答

2

你需要的是沿着线的东西:

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,我们要么知道没有任何信用或者存在的任何信用都将被删除。在这种情况下,验证失败,我们添加错误。

+0

谢谢彼得,marked_for_destruction是我正在寻找,但任何?你使用的方法太棒了。 – fahrio 2009-10-06 08:18:14

+0

酷,很好的工作彼得。 – klochner 2009-10-06 16:39:51

-2

尝试在work.rb


before_save :check_credits 

private 
def check_credits 
    self.credits > 0 
end 

使用before_save如果学分< =零,保存也不会去。

+2

不,这是行不通的。我认为问题在于,由于信用被标记为删除,并且在保存之前将隐藏复选框值设置为1,所以信用仍然存在,直到保存完成。那么self.credits.size> 0或self.credits.blank?不会做这项工作。如果我可以访问已提交信用的_delete参数,我可以停止保存,但我无法找到从模型中访问该属性的方法。 – fahrio 2009-10-05 23:31:48

+0

fahrio是完全正确的问题。 – 2009-10-06 00:51:06