Диапазон с ведущим нулем в рубине - PullRequest
5 голосов
/ 21 апреля 2010

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

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

Поэтому я использую 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

Ответы [ 5 ]

16 голосов
/ 21 апреля 2010

Проблема в том, что сами числа не имеют начальных нулей (или, наоборот, имеют бесконечное число начальных нулей, которые никогда не печатаются). Чтобы получить ведущие нули, вам нужны строки. К счастью, в 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 за указание на этот бит.)

14 голосов
/ 30 июня 2012

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

2 голосов
/ 02 марта 2012

Использование rjust сделает его проще и красивее, я думаю:

(1..12).collect{ |i| i.to_s.rjust(2,'0') }
2 голосов
/ 22 апреля 2010

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

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

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

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

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

0 голосов
/ 21 апреля 2010

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

= f.select(:birthmonth, options_for_select((1..12).collect{ |i| i < 10 ? "0#{i}" : i }))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...