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

14

如何在Rails中验证美国邮政编码?

我写了以下代码但它并不起作用:

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


7
请定义“it doesn't work”。(意为:请解释“它不起作用”的含义。) - jdl
5个回答

20

您还可以使用以下方式验证ZIP文件是否有效(不仅是格式,还包括ZIP本身):


http://www.webservicex.net/uszip.asmx?op=GetInfoByZIP

尝试一个您知道的有效的ZIP文件,例如02135,与无效的ZIP文件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完成此操作,因为这意味着它也可以用于符合固定已知格式(例如美国)的电话号码等其他内容。
首先,可能应该验证格式并在无效时给出错误,以便在Rails中使用标准闪存消息处理所有内容。
然后,如果有效,再调用服务器验证实际的邮政编码本身。

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

完整的服务解决方案还将检查邮政编码服务的超时,并且如果发生超时(例如5秒),并且格式正确,则最好接受该值。 如果可能,可以设置一个“未验证的邮政编码”标志!


2
如果您使用正则表达式,^$ 匹配的是行(位于换行符之间的文本),而不是整个字符串。在 ^ 的位置使用 \A,在 $ 的位置使用 \z 可以确保整个字符串有效。 - Aaron Lasseigne
这是 Aron 在他的评论中提供的更详细解释的链接:http://aaronlasseigne.com/2016/06/10/proper-regexp-anchoring/?utm_source=rubyweekly&utm_medium=email - Calin
webservicex.net的链接已经失效。 - BinaryButterfly

12

这对我起效了:(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
如果您需要多国支持,您可以使用我发布的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

0

美国的邮政编码是5位数字或带有4位区号的5位数字。请尝试以下操作:

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

谢谢,但当我输入123456时,它验证通过了。 - Michał Makaruk
1
哦,我得到了另一次机会 - 请检查我的代码。我已经删除了对此的引用并添加了自己的正则表达式供您尝试 - :with => /^\d{5}(-\d{4})?$/ - Michael Durrant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接