2011-09-30 62 views
2

我有幾個before_validation回調操作在我的模型上設置的屬性。我遇到麻煩時,我有這樣的情況:我的Rails before_validation回調應該如何處理錯誤的數據?

class Foo < ActiveRecord::Base 

    before_validation :capitalize_title 
    validates :title, :presence => true 

    def capitalize_title 
    title.upcase 
    end 

end 

我寫一個測試,以確保「零」的稱號是不允許的,但因爲nil.upcase沒有定義的測試得到一個錯誤。我想處理這個錯誤,但是我已經在before_validation回調之後運行了錯誤處理。

我不想對我所有的before_validation回調進行檢查,以確保數據存在,如果我可以避免它。

是否有一種乾淨的或可接受的方式來處理這種類型的情況?

+1

的'captialize_title方法應該有一個檢查,正如畝建議。如果你直接從某些代碼調用該方法,並且'title'爲零 - 你會得到一個錯誤,那麼代碼就不好。 另外,你在這種情況下將檢查放在方法上,而不是在'before_validate'回調函數中 - 通過對回調進行檢查並不確定你的意思。 – Zabba

回答

6

只需檢查是否有標題。不要忘記保存修改後的標題。

def capitalize_title 
    title = title.upcase if title 
end 

如果你需要修補的東西了一個before_validation鉤,然後你堅持照顧無效數據的兩個地方。如果您的驗證是複雜的,你可以因子它分成兩個部分:即必須是真實的前before_validation可以運行一個整體,並且必須是真正的一個片before_validation已運行後:

before_validation :mangle_data 
validate :data_is_okay 

#... 

def mangle_data 
    return if(!data_is_mangleable) 
    #... mangle away 
end 

def date_is_okay 
    if(!data_is_mangleable) 
     # complain 
    end 
    if(!data_is_properly_mangled) 
     # complain some more 
    end 
end 

def data_is_mangleable 
    return false if(thing.nil?) 
    # etc. 
end 

def data_is_properly_mangled 
    # check that stuff that the before_validation hook doesn't 
    # have to care about. 
end 
+0

我的擔心是,通過複雜的一系列回調操作幾位數據,我需要用這些條件來清理我的代碼。也許這是不可避免的。 –

+0

@Nathan:你可能可以將你的驗證分成兩部分,我添加了一個更新概述了總體思路。 –

相關問題