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

时间:2012-06-08 15:17:07

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试保存在"07306""03452"中传递的邮政编码,但to_i似乎正在将这些字符串值转换为7306和验证前3452,因为验证失败。

如何防止Ruby删除前导零?

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

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

3 个答案:

答案 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中的字段类型......所以,是的,我觉得现在输入所有这些都有点傻。