2009-10-05 172 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