Почтовый индекс, to_i и ведущий ноль в Ruby / Rails

Я пытаюсь сохранить почтовые индексы, которые передаются в параметрах как"07306", а также"03452", ноto_i кажется, преобразует эти строковые значения в7306 а также3452 до проверки, из-за которой проверка не проходит.

Как я могу помешать Ruby удалить ведущие нули?

Почтовый индекс является целочисленным полем в базе данных, и проверка проверяет формат почтового индекса, используя:

validates_format_of :zip, :with => /\A[+\-]?\d+\Z/, :message => "Please enter a valid US zipcode"
 xdazz08 июн. 2012 г., 17:19
Почтовый индекс не следует сохранять как целое число.

Ответы на вопрос(3)

а также поможет в будущем, если вы решите поддерживать иностранные почтовые индексы, которые могут содержать или не содержать буквы.

 21 авг. 2014 г., 21:01
& quot; может иметь или не иметь буквы & quot; или дефисы или пробелы. Пользователи могут вводить самые сложные вещи.

я согласен, что не имеет смысла хранить почтовые индексы как целые числа именно по этой причине. Я также думаю, что вы должны быть уверены, что вам не понадобятся почтовые индексы неамериканского происхождения в вашем приложении. С этими предостережениями с дороги, хотя ...

Если по какой-то причине вы не можете изменить базу данных, вы можете изменить метод 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

Это немного хакерски, и я действительно не рекомендую делать это таким образом, если вы можете изменить поле БД, чтобы оно было строкой (varchar).

Возможно, вы также захотите изменить используемую вами проверку, так как это позволит использовать почтовые индексы длиной менее 5 символов.

Может быть, использовать что-то вроде этого:

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

РЕДАКТИРОВАТЬ: Я оставлю этот ответ здесь, но я только что заметил, что ОП уже изменил тип поля в БД ... Так что, да, я чувствую себя немного глупо, потому что набрал все это сейчас.

 Raghu08 июн. 2012 г., 18:21
Это решение нарушит валидацию в этом сценарии, где в e пользователь пытается ввести 4-значный zip, который недопустим по правилу, а add_leading_zeros будет считать, что пользователь отправил 5-значный zipcode с начальным нулем и добавит ноль и сохрани это.
 Raghu08 июн. 2012 г., 18:22
Я преобразовал тип поля в строку, чтобы исправить проблему

0 когда речь идет о целом числе. Либо отформатируйте почтовый индекс, когда вы его используете (т.е. убедитесь, что он имеет правильный формат, добавьте ведущий0 при преобразовании из int в str) или сохраните его как строку

 21 авг. 2014 г., 21:02
Сохраните это как строку. Нет смысла сохранять строки цифр в виде чисел, если с ними не выполняется математика.
 Raghu08 июн. 2012 г., 17:36
Спасибо за предложение, я изменил тип поля на строку, чтобы решить проблему

Ваш ответ на вопрос