Рельсы условной проверки почтового индекса для многих стран - PullRequest
1 голос
/ 20 марта 2012

Мне нужна проверка на уровне модели для почтовых индексов в США и Канаде.Этот код заставляет меня чувствовать себя плохо:

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

Как сделать этот код более элегантным, написав одну строку проверки для каждого поля?

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Вы можете использовать gem validates_as_postal_code

Это позволяет проверять почтовые индексы следующим образом:

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

и многое другоеОпции

РЕДАКТИРОВАТЬ: Есть также один хороший камень: собирается_посталь проверить это!

0 голосов
/ 27 сентября 2014

Я собрал несколько кусочков в этот камень: 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
...