使用Rails验证美国邮政编码格式

时间:2011-11-21 13:12:57

标签: ruby-on-rails ruby-on-rails-3 validation zipcode

如何使用Rails验证美国邮政编码?

我写了类似的东西,但它不起作用:

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

5 个答案:

答案 0 :(得分:20)

您还可以使用以下方法验证它实际上是一个有效的zip(不仅仅是格式而是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,因为这意味着它也可以用于电话号码等,也适合固定的,已知的格式(.eg US)。 /> 也许首先验证格式并在无效时给出错误,因此使用标准flash消息在rails中处理所有内容 然后,如果有效,则调用该服务器以验证实际的zip本身。

伟大的服务器提供的验证的唯一缺点是它们增加了对其他站点和服务的依赖性。因此,如果其他网站/服务发生变化或不可用等,则存在问题。这是为什么首先进行更简单的有效性检查是个好主意的另一个原因。

完整的服务解决方案还会检查邮政编码服务是否超时,如果发生这种情况,请说5秒,格式正常可能最好接受价值。如果可能的话,也许设置一个'unverified_zip'标志!

答案 1 :(得分:11)

这对我有用:(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

希望它有用。

答案 2 :(得分:4)

如果您需要多国支持,可以使用我发布的validates_zipcode gem。它目前支持 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

答案 3 :(得分:0)

美国的邮政编码是5位数字或5位数字加上区号的4位数字。请尝试以下方法:

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

答案 4 :(得分:0)

这些都是很好的答案!

另一个想法是创建自己的自定义验证,它不仅检查数字的位数是否正确,还检查后台的数据库,邮政编码是否存在..

e.g。这些宝石可以提供帮助:

geokit,点击此处:Best Zip Code Plugin for Ruby

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

http://zipcodesearch.rubyforge.org/