2012-07-29 71 views
0

我目前正在研究一個Rails 3應用程序,該應用程序具有一個窗體,該窗體將一個父對象與從相當大的數組中選擇的幾個預定義屬性進行比較。每個父對象都有幾個子對象,這些對象取決於您在父對象中選擇了哪些預定義的屬性,可以具有WILDLY不同的最小 - 最大值,每個值都有自己獨立的常見唯一限制。Rails 3極大模型驗證

我很快意識到驗證這些對象將導致一個非常大的模型文件。我想知道是否有合適的方法從模型中刪除這種大規模驗證(或者至少讓模型指向其他地方)。

此外,還有一個更高層次的問題,是否有正常的說法...... 1000行代碼來驗證對象數據的完整性?

+1

絕對不是「正常」,在您的模型中有1000行驗證代碼。 – Dty 2012-07-29 01:44:32

+0

嗯,我猜正常不是正確的術語。一個更好的術語是合理的。我知道大多數情況下,你可以使用助手方法,也可以使用1個自定義助手(比如驗證電子郵件地址)幾行。然而,我正在處理的有很多小細節,根據您選擇的內容而有所不同。因此,爲了捕捉每一個小小的情況,代碼似乎很快就會膨脹起來。因此,我試圖將其移出模型。 – user1560348 2012-07-29 04:22:49

回答

2

1)您可以創建自定義的驗證器類,其中包括加載ActiveModel從::驗證inheirting和實現一個validate方法,它記錄驗證:

class Report > ActiveRecord::Base 
    validates with MyValidator 
end 

class MyValidator < ActiveModel::Validator 
def validate(record) 
    record.errors[:base] = << "Error" unless is_valid(record) 
    end 
end 

2)在Rails 3,有驗證宏,這意味着擴展ActiveModel :: EachValidator:

class Report < ActiveRecord::Base 
    validates :name :report_like => true 
end 

class ReportLikeValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    unless value["Report"] 
     record.errors.add attribute, "Does not appear to be a ..." 
    end 
end 
+0

對於這些自定義驗證器類,我應該將它們放在我的rails應用程序中?我讀過的一些地方推薦使用lib目錄,但只有將代碼放入模型中,即使我的簡單驗證工作正常。 – user1560348 2012-07-29 04:25:14

+0

看看這篇文章:http://my.rails-royce.org/2010/07/21/email-validation-in-ruby-on-rails-without-regexp/ – JohnMerlino 2012-07-29 04:27:11