Утвердите формат почтового индекса США с Rails - PullRequest
11 голосов
/ 21 ноября 2011

Как вы проверяете почтовый индекс США с помощью Rails?

Я написал что-то вроде этого, но это не работает:

validates_format_of :zip_code,
  :with => /^\d{5}(-\d{4})?$/,
  :message => "Zip code should be valid"

Ответы [ 5 ]

20 голосов
/ 21 ноября 2011

Вы также можете проверить, что это действительно действительный почтовый индекс (не только формат, но и сам почтовый индекс), используя:
http://www.webservicex.net/uszip.asmx?op=GetInfoByZIP

Попробуйте действительный почтовый индекс, который вы знаете, например, 02135 против недопустимого типа 09990, чтобы увидеть разницу.

Я бы подумал объединить это с:

validates_format_of :zip, :with => /^\d{5}(-\d{4})?$/, :message => "should be in the form 12345 or 12345-1234"

что это сделано с validate_format_of, а не validate_format_of_zip_code, поскольку это означает, что его также можно использовать для телефонных номеров и т. Д., Которые также соответствуют фиксированному, известному формату (например, США).
Возможно, сначала проверьте формат и выдайте ошибку, если она недействительна, так что обрабатывайте все это с помощью стандартного флеш-сообщения.
Затем, если он действителен, сделайте вызов этому серверу, чтобы проверить сам фактический почтовый индекс.

Единственный недостаток таких проверок, предоставляемых отличным сервером, заключается в том, что они увеличивают зависимость от других сайтов и служб. Так что, если другой сайт / служба что-то меняет или недоступен и т. Д., Возникает проблема. Это еще одна причина, почему сначала лучше выполнить более простую проверку достоверности.

Полноценное сервисное решение также будет проверять время ожидания службой почтового индекса, и если это произойдет, скажем, 5 секунд, и формат в порядке, вероятно, лучше всего принять значение. Возможно, установите флаг unverified_zip, если это возможно!

11 голосов
/ 01 августа 2013

Это сработало для меня: (ruby-2.0.0-p247, rails 4.0.0)

  validates_format_of :zip_code,
                  with: /\A\d{5}-\d{4}|\A\d{5}\z/,
                  message: "should be 12345 or 12345-1234",
                  allow_blank: true

Жаль, что это полезно.

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

Если вам нужна поддержка нескольких стран, вы можете использовать validates_zipcode камень, который я выпустил. В настоящее время он поддерживает форматы 159 стран почтовых индексов и прекрасно работает с 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
0 голосов
/ 22 ноября 2011

это оба хорошие ответы!

другая идея заключается в создании собственной пользовательской проверки, которая не только проверяет правильность количества цифр, но также проверяет базу данных на заднем плане, что zip-коды существуют ..

например, эти драгоценные камни могут помочь:

геокит, проверьте здесь: Лучший плагин почтового индекса для Ruby

почтовый индекс-информация, http://rubygems.org/gems/zip-code-info

http://zipcodesearch.rubyforge.org/

0 голосов
/ 21 ноября 2011

Почтовые индексы в США состоят из 5 или 5 цифр плюс 4 цифры для кода города.Попробуйте следующее:

validates_format_of :zip_code,
                    :with => %r{\d{5}(-\d{4})?},
                    :message => "should be 12345 or 12345-1234"
...