Zipcode、to_i和Ruby/Rails中的前导零

3

我正在尝试保存通过参数传递的邮政编码"07306""03452",但是to_i似乎在验证之前将这些字符串值转换为73063452,因此验证一直失败。

我该如何防止Ruby删除前导零?

数据库中的邮政编码是整数字段,并且验证使用以下格式检查邮政编码:

validates_format_of :zip, :with => /\A[+\-]?\d+\Z/, :message => "Please enter a valid US zipcode"

7
邮政编码不应该保存为整数。 - xdazz
3个回答

5

在讨论整数时,前导的0是没有概念意义的。当您使用邮政编码时,请格式化它(即确保它具有正确的格式,在从int转换为str时添加前导0),或将其保存为字符串。


谢谢您的建议,我将字段类型更改为字符串以解决问题。 - Raghu
2
将其保存为字符串。如果没有对它们进行任何数学运算,那么将数字字符串保存为数字是没有意义的。 - the Tin Man

5
将其保存为字符串将缓解此问题,如果您决定支持可能包含字母的外国邮政编码,这也有助于未来保护事物。

可能包含字母、连字符或空格。用户可能会输入任何奇怪的东西。 - the Tin Man

1

是的,我同意仅出于这个原因将zip文件存储为整数没有意义。我还认为您需要非常确定您的应用程序永远不需要非美国邮政编码。然而,在解决这些注意事项后...

如果由于某种原因无法修改数据库,则可以修改邮政编码的获取方法,如下所示:

def zip
  val = read_attribute(:zip).to_s
  val.length < 5 ? add_leading_zeros(val) : val
end

def add_leading_zeros(val)
  while val.length < 5 do
    val = "0" + val.to_s
  end
  val
end

这种方法有点不正规,如果可以将数据库字段修改为字符串(varchar),我真的不建议这样做。

您可能还需要修改您正在使用的验证程序,因为它将允许少于5个字符的邮政编码通过。

也许可以尝试使用类似以下的代码:

validates_format_of :zip, :with => /^\d{5}$/

编辑:我会把这个答案留在这里,但是我刚刚注意到OP已经在数据库中更改了字段类型...所以,是的,现在我有点傻气。


这个解决方案会在以下情况下破坏验证:当用户尝试输入一个不符合规则的4位邮政编码时,add_leading_zeros函数会认为用户发送了一个带有前导零的5位邮政编码,并将零附加并保存。 - Raghu
我已将字段类型转换为字符串以解决问题。 - Raghu

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