【问题标题】:Validate US Zip Code format with Rails使用 Rails 验证美国邮政编码格式
【发布时间】:2011-11-21 13:12:57
【问题描述】:

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

我写了这样的东西,但它不起作用:

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

【问题讨论】:

  • 请定义“它不起作用”。

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


【解决方案1】:

您还可以使用以下方法验证它实际上是一个有效的 zip(不仅仅是格式,还有 zip 本身):
http://www.webservicex.net/uszip.asmx?op=GetInfoByZIP

尝试使用您知道的有效 zip,例如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,因为这意味着它也可以用于电话号码等也适合固定的已知格式(例如美国)。
可能先验证格式,如果无效则给出错误,因此请使用标准 Flash 消息在 Rails 内处理所有内容。
然后,如果有效,则调用该服务器以验证实际的 zip 本身。

像这样出色的服务器提供验证的唯一缺点是它们增加了对其他站点和服务的依赖。因此,如果其他站点/服务发生更改或不可用等,就会出现问题。这也是为什么首先进行更简单的有效性检查是个好主意的另一个原因。

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

【讨论】:

  • 如果您使用正则表达式,^$ 匹配行(换行符之间的文本)而不是整个字符串。使用\A 代替^\z 代替$ 将确保整个字符串有效。
  • 这里是@aron对他的评论aaronlasseigne.com/2016/06/10/proper-regexp-anchoring/…的更长解释的链接@
  • webservicex.net 链接已关闭
【解决方案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_zipcodegem。它目前支持 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
    

    【讨论】:

      【解决方案4】:

      美国的邮政编码为 5 位或 5 位加 4 位的区号。请尝试以下操作:

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

      【讨论】:

      • 谢谢,但是当我输入 123456 时,它验证没问题
      • 哦-我还有一次机会-请检查我的。我已删除对此的引用并添加了我自己的正则表达式供您尝试-:with =&gt; /^\d{5}(-\d{4})?$/
      【解决方案5】:

      这些都是很好的答案!

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

      例如这些宝石可以提供帮助:

      geokit,查看这里:Best Zip Code Plugin for Ruby

      邮编信息,http://rubygems.org/gems/zip-code-info

      http://zipcodesearch.rubyforge.org/

      【讨论】:

        猜你喜欢
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多