2011-05-10 46 views
2

假設您有幾個模型包含地址,郵政編碼,省/國家/地區,電話號碼等字段。在rails中重構驗證邏輯和正則表達式的最佳方式是什麼?

這些是具有特定正則表達式驗證的相當常見的字段。如果您在每個模型中放入相同的驗證和正則表達式,它將被複制。此外,測試是重複的。這是一種氣味;)

什麼是使用ruby和rails來重構這些類型的東西的最佳方法?一個模塊?在使用Hibernate的Java中,我們使用Component類來存儲地址,然後我們將驗證邏輯放在那裏。每個想要使用地址的模型都只包含一個地址,它將獲得所有的地址驗證邏輯。

什麼是在軌道中實現相同的東西的方法?謝謝!

+0

你的模塊想法似乎對我來說很重要。我將創建一個具有適當功能的模塊,然後將其混合。 – 2011-05-10 02:32:43

+0

您也可以考慮將地址列移動到單獨的表中並使用多態關聯(即'belongs_to:addressable,:polymorphic => true') – zetetic 2011-05-10 02:38:58

+0

甚至可能想創建自己的類,而不是一個模塊。 – 2011-05-10 03:00:15

回答

1

爲您需要的各種類型的驗證構建自定義驗證器,然後在模型類中調用它們。

例如:

 
class PostalCodeValidator < ActiveModel::EachValidator 
    def validate_each(record, attr_name, value) 
    unless value =~ /^\d{5}$/ 
     record.errors[attr_name] << "must be a 5-digit postal code" 
    end 
    end 

現在使用該驗證在每個模型中的類和用於這是一個郵政編碼每個屬性。舉例來說,如果客戶有一個屬性POSTAL_CODE:

 
class Customer < ActiveRecord::Base 
    validates :postal_code, :postal_code => true 
end 

還有更多的細節和大量花哨的選擇,所以我建議在軌道上自定義驗證谷歌搜索。

+0

是否值得將實際字段重構爲一個模塊或類似的東西?例如...地址,郵政編碼和province_id基本上總是組合在一起。 – egervari 2011-05-10 05:45:21

+0

您是否要爲該模塊添加一些嚴重的功能,或僅將其用作一種結構?我會這樣做,如果我有超過兩個類使用這些字段分組在一起,並且如果有多個方法與該組相關聯。決定的標準是你是否真的簡化了事情或者增加了複雜性。 – Elad 2011-05-10 06:31:01

+0

好吧,我會做簡單的事情,直到變得不那麼明智了;)謝謝 – egervari 2011-05-12 13:56:56