Диапазон с ведущим нулем в ruby

У меня есть форма, в которой мои пользователи могут зарегистрироваться на моем сайте.

Они заполняют дату своего рождения в форме: год рождения, месяц рождения и день рождения.

Итак, я использую Range для создания выбора в такой форме:

= f.select(:birthmonth, options_for_select((1..12)))

Но однозначные числа не начинаются с нуля, как я хочу: 01, 02, 03, 04, 05, 06, 07, 08, 09, 10 и т. д.

Я даже пробовал это, но это не сработало:

= f.select(:birthmonth, options_for_select((01..12)))

Кто-нибудь, кто знает, как заставить Range начинаться с ведущих нулей? Или любой другой способ сделать это, чтобы я мог использовать его при проверке?:

validates_inclusion_of :birthmonth, :in => 1..12

person Lisinge    schedule 21.04.2010    source источник


Ответы (5)


Проблема в том, что сами числа не имеют начальных нулей (или, наоборот, имеют бесконечное количество начальных нулей, которые никогда не печатаются). Чтобы получить ведущие нули, вам нужны строки. К счастью, в Ruby встроена такая возможность форматирования строк.

= f.select(:birthmonth, options_for_select((1..12).map {|n| "%02d" % n}))

%02d — это спецификатор форматирования, который означает «дополнить его ведущими нулями, если оно меньше двух цифр».

Для проверки вам нужно будет сделать то же преобразование:

validates_inclusion_of :birthmonth, :in => (1..12).map {|n| "%02d" % n}

(Спасибо @r-dub за указание на этот момент.)

person Chuck    schedule 21.04.2010
comment
Вероятно, вам следует добавить правильный оператор проверки в свой ответ для полноты. validates_inclusion_of :месяц рождения, :in =› (1..12).map {|n| %02d % п} - person rwilliams; 21.04.2010
comment
Он не будет проверяться, когда я выбираю число, начинающееся с нуля. Числа, начинающиеся с единицы, подтверждаются - person Lisinge; 21.04.2010
comment
Добавьте строку проверки, которую я указал в своем последнем комментарии, и все должно работать нормально. Ваша текущая проверка не совпадает со значениями, которые Чак указал в своем ответе для поля выбора. - person rwilliams; 21.04.2010
comment
Кажется, это работает в части проверки. (1..12).map {|n| (%02d % n).to_s} - person rwilliams; 21.04.2010
comment
Похоже, это потому, что все месяцы будут преобразованы в строки. И он проверяет только целые числа - person Lisinge; 21.04.2010
comment
Я отредактировал свой последний комментарий с правильным выражением, которое преобразует их в строки. - person rwilliams; 21.04.2010
comment
Мне удалось заставить его работать с решением Джимми Бейкера, изменив его на это: (1..12).collect{ |i| я ‹ 10 ? 0+я : я } - person Lisinge; 21.04.2010
comment
Ты был быстрее меня! Спасибо! - person Lisinge; 21.04.2010

На самом деле вы можете просто сделать: '01'..'12'

person pguardiario    schedule 29.06.2012

Если это просто проблема представления, вы можете создать пары [текст, значение] и передать их в options_for_select:

Для контейнера, в котором элементы реагируют на первый и последний (например, массив из двух элементов), «последние» служат значениями параметров, а «первые» — текстом параметров.

Итак, что-то вроде:

options_for_select((1..12).map {|n| ["%02d" % n, n]})

Таким образом, вы сможете сохранить свою логику проверки как есть.

person Mladen Jablanović    schedule 21.04.2010
comment
+1 Вероятно, лучший ответ, хотя и немного опоздавший на вечеринку. - person rwilliams; 22.04.2010

Я думаю, использование rjust сделало бы это проще и красивее:

(1..12).collect{ |i| i.to_s.rjust(2,'0') }
person Mohammad Badrah    schedule 02.03.2012

Попробуйте заполнить числа меньше 10, например:

= f.select(:birthmonth, options_for_select((1..12).collect{ |i| i < 10 ? "0#{i}" : i }))
person Jimmy Baker    schedule 21.04.2010
comment
Спасибо! могу ли я использовать это при проверке? - person Lisinge; 21.04.2010
comment
В результате этого хака у вас будут смешанные типы в результирующем массиве, некоторые элементы будут преобразованы в строки, а другие оставлены как целые числа. Хотя это, вероятно, не вызовет никаких проблем в данном конкретном случае, такой вид взлома никогда не должен рассматриваться как вариант, по крайней мере, не в Ruby (мне это кажется привычкой PHP). - person Mladen Jablanović; 22.04.2010