Ruby / Rails中的Zipcode,to_i和前导零
我试图保存在参数中传递为"07306"
和"03452"
,但是to_i
似乎在validation之前将这些字符串值转换为7306
和3452
,因为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中的字段类型......所以,是的,我觉得现在输入所有这些都有些愚蠢。