我正在尝试保存在"07306"
和"03452"
中传递的邮政编码,但to_i
似乎正在将这些字符串值转换为7306
和验证前3452
,因为验证失败。
如何防止Ruby删除前导零?
邮政编码是数据库中的整数字段,验证使用以下方法检查zip的格式:
validates_format_of :zip, :with => /\A[+\-]?\d+\Z/, :message => "Please enter a valid US zipcode"
答案 0 :(得分:5)
在谈论整数时,在概念上使前导0
没有意义。在使用时格式化zipcode(即确保它具有正确的格式,在从int转换为str时添加前导0
),或将其保存为字符串
答案 1 :(得分:5)
将其保存为字符串可以缓解这个问题,如果您决定支持可能包含或不包含字母的外国邮政编码,也可以帮助解决未来问题。
答案 2 :(得分:1)
是的,我同意将拉链存储为整数是没有意义的。我还认为您需要非常确定您的应用中不需要非美国邮政编码。尽管有这些警告,但是......
如果由于某种原因无法修改数据库,可以修改邮政编码的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),我真的不建议这样做。
您可能还想修改您正在使用的验证,因为它将允许少于5个字符的邮政编码。
也许使用这样的东西:
validates_format_of :zip, :with => /^\d{5}$/
编辑:我会在这里留下这个答案,但我只是注意到OP已经改变了DB中的字段类型......所以,是的,我觉得现在输入所有这些都有点傻。