Подтвердить формат почтового индекса США с помощью Rails

Как вы проверяете почтовый индекс U.S. с помощью Rails?

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

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

Ответ 1

Вы также можете проверить, что на самом деле это действительный почтовый индекс (а не только формат, но сам zip), используя:
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, поскольку это означает, что он также может использоваться для телефонных номеров и т.д., которые также соответствуют фиксированному известному формату (например, США).
Возможно, сначала проверьте формат и дайте ошибку, если это недействительно, поэтому обрабатывайте все это в рельсах со стандартным флэш-сообщением.
Затем, если значение valid делает вызов этого сервера для проверки фактического самого zip.

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

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

Ответ 2

Это сработало для меня: (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

Пожелайте, чтобы это было полезно.

Ответ 3

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

Ответ 4

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

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

Ответ 5

Это хорошие ответы!

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

например. эти драгоценные камни могли бы помочь:

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

zip-code-info, http://rubygems.org/gems/zip-code-info

http://zipcodesearch.rubyforge.org/