3

params に渡された郵便番号を"07306", andとして保存しようとしています"03452"が、検証が失敗し続けるため、これらの文字列値を検証前にto_i変換しているようです。73063452

Ruby が先頭のゼロを削除しないようにするにはどうすればよいですか?

郵便番号はデータベース内の整数フィールドであり、検証では以下を使用して郵便番号の形式がチェックされます。

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

3 に答える 3

5

0整数について話すときに先頭を付けることは、概念的には意味がありません。使用するときに郵便番号をフォーマットするか (つまり、正しいフォーマットであることを確認し0、int から str に変換するときに先頭を追加します)、または文字列として保存します。

于 2012-06-08T15:20:34.607 に答える
5

代わりに文字列として保存すると、その問題が軽減されます。また、文字が含まれている場合と含まれていない場合がある外国の郵便番号をサポートすることにした場合、将来の保証にも役立ちます。

于 2012-06-08T15:24:32.803 に答える
1

ええ、私は、この理由だけで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

これは一種のハッキーであり、DBフィールドを文字列(varchar)に変更できる場合は、この方法を使用することはお勧めしません。

また、使用している検証を変更することもできます。これにより、5文字未満の郵便番号が許可されます。

多分このようなものを使用してください:

validates_format_of :zip, :with => /^\d{5}$/

編集:この答えはここに残しておきますが、OPがすでにDBのフィールドタイプを変更していることに気づきました...だから、ええ、これをすべて入力したのは少しばかげています。

于 2012-06-08T15:47:08.767 に答える