2009-10-12 159 views
3

我有一個有幾個accept_nested_attributes_for的模型。有一個要求,當保存和繼續時,我至少有一個嵌套屬性。在保存後驗證Rails模型?

然而,驗證發生前的保存,所以當我刪除的項目和活動,它讓我們到底。

我如何可以驗證,當我保存,我讓每個嵌套類型有至少一個項目?

+0

你會做什麼,如果驗證失敗? – 2009-10-12 15:24:14

+0

errors.add_to_base – 2009-10-12 15:26:18

+0

@neil:不,我的意思是現在保存了無效模型,所以您需要調整模型。 – 2009-10-12 16:31:48

回答

6

有與accepts_nested_attributes_for的錯誤。這意味着在父模型中進行驗證時,您必須更加狡猾。

你可以使用一個:after_save的回調函數在每個嵌套模式,以檢查它是否是最後一個。但是如果有很多嵌套關聯需要確保至少有一個,那麼這不是非常乾燥。

然而,這是鏈接錯誤一個有效的解決方法:

class Whatever < ActiveRecord::Base 
    :has_many => :association_a 
    :has_many => :association_b 

    def ensure_minimum_associations 
    bad_associations = [:association_a, :association_b]. 
     select{|assoc| self.send(assoc).all?{|a| a.marked_for_destruction?}} 
    unless bad_associations.empty? 
     bad_associations.each do |association| 
     errors.add_to_base "Each #{self.class.name.downcase} must retain at least one #{association}" 
     end 
     return false 
    end 
    end 
end 
0

您可以隨時撥打一個模型valid?,它會運行驗證。

+0

我意識到這一點,但我需要它在保存之前發生 - 在嵌套屬性之前保存父對象get – 2009-10-12 16:35:39

+0

如果任何驗證返回false,則整個事務將回滾。無論它是在父級還是嵌套模型中。 – EmFi 2009-10-12 18:21:57