Вы также можете проверить, что это действительно действительный почтовый индекс (не только формат, но и сам почтовый индекс), используя:
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, если это возможно!