我正在尝试保存通过参数传递的邮政编码"07306"
和"03452"
,但是to_i
似乎在验证之前将这些字符串值转换为7306
和3452
,因此验证一直失败。
我该如何防止Ruby删除前导零?
数据库中的邮政编码是整数字段,并且验证使用以下格式检查邮政编码:
validates_format_of :zip, :with => /\A[+\-]?\d+\Z/, :message => "Please enter a valid US zipcode"
我正在尝试保存通过参数传递的邮政编码"07306"
和"03452"
,但是to_i
似乎在验证之前将这些字符串值转换为7306
和3452
,因此验证一直失败。
我该如何防止Ruby删除前导零?
数据库中的邮政编码是整数字段,并且验证使用以下格式检查邮政编码:
validates_format_of :zip, :with => /\A[+\-]?\d+\Z/, :message => "Please enter a valid US zipcode"
在讨论整数时,前导的0是没有概念意义的。当您使用邮政编码时,请格式化它(即确保它具有正确的格式,在从int转换为str时添加前导0),或将其保存为字符串。
是的,我同意仅出于这个原因将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已经在数据库中更改了字段类型...所以,是的,现在我有点傻气。