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

我试图保存在参数中传递为"07306""03452" ,但是to_i似乎在validation之前将这些字符串值转换为73063452 ,因为validation仍然失败。

如何防止Ruby删除前导零?

邮政编码是数据库中的整数字段,validation使用以下方法检查zip的格式:

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

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

将其保存为字符串将减轻该问题,并且如果您决定支持可能包含或不包含字母的外国邮政编码,也可以帮助面向未来的事情。

是的,我同意将拉链存储为整数是没有意义的。 我还认为你需要非常确定你的应用程序中不需要非美国邮政编码。 尽管有这些警告,但……

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

 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 

它有点hacky,如果你可以将DB字段修改为字符串(varchar),我真的不建议这样做。

您可能还想修改您正在使用的validation,因为它将允许少于5个字符的邮政编码。

也许使用这样的东西:

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

编辑:我会在这里留下这个答案,但我只是注意到OP已经改变了DB中的字段类型......所以,是的,我觉得现在输入所有这些都有些愚蠢。