我正在尝试将在参数中传递的邮政编码保存为"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
在谈论整数时,在概念上没有前导是没有意义的。使用时格式化邮政编码(即确保格式正确,0
从 int 转换为 str 时添加前导),或将其保存为字符串
将其保存为字符串将缓解该问题,并且如果您决定支持可能包含或不包含字母的外国邮政编码,也将有助于面向未来的事情。
是的,我同意出于这个原因将 zip 存储为整数是没有意义的。我还认为您需要非常确定您的应用程序中永远不需要非美国邮政编码。有了这些警告,虽然......
如果由于某种原因无法修改数据库,可以修改邮政编码的 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 已经改变了数据库中的字段类型......所以,是的,我现在输入所有这些感觉有点傻。