2012-03-20 105 views
1

我需要美国和加拿大邮政编码的模型级验证。此代码让我感觉不好:Rails许多国家的邮政编码条件验证

zip_regex_usa = %r{\d{5}(-\d{4})?} 
zip_regex_canada = %r{[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d} 

validates :shipping_zip, :presence => true, :format => { :with => zip_regex_usa }, :if => :shipping_to_usa? 
validates :shipping_zip, :presence => true, :format => { :with => zip_regex_canada }, :if => :shipping_to_canada? 
validates :billing_zip, :presence => true, :format => { :with => zip_regex_usa }, :if => :billing_to_usa? 
validates :billing_zip, :presence => true, :format => { :with => zip_regex_canada }, :if => :billing_to_canada? 

def shipping_to_usa? 
    shipping_country == 'US' 
end 

def billing_to_usa? 
    billing_country == 'US' 
end 

def shipping_to_canada? 
    shipping_country == 'CA' 
end 

def billing_to_canada? 
    billing_country == 'CA' 
end 

如何使这段代码更优雅,为每个字段写一条验证行?

+0

您也可以尝试在http张贴这样的:// codereview.stackexchange.com/ – ScottJShea 2012-03-20 20:10:42

回答

1

您可以使用宝石validates_as_postal_code

它可以让你检查这样邮编:

class Person < ActiveRecord::Base 
    validates_as_postal_code :postal_code, :country => "CA", :allow_blank => true 
end 

,这儿有更多的选择

编辑: 里也有一个好宝石:going_postal看看吧!

0

我把这些宝贝放在一起:validates_zipcode

它目前支持259个国家邮政编码格式和播放使用Rails好的3 & 4.

您可以使用它像这样:

class Address < ActiveRecord::Base 
    validates_zipcode :zipcode 
    validates :zipcode, zipcode: true 
    validates :zipcode, zipcode: { country_code: :ru } 
    validates :zipcode, zipcode: { country_code_attribute: :my_zipcode } 
end