2010-04-21 13 views
5

Tengo un formulario donde mis usuarios pueden registrarse en mi sitio.Rango con cero inicial en rubí

Rellenan su fecha de cumpleaños en la forma: birthyear, birthmonth y birthday.

Así que estoy usando gama para crear la selección en la forma como esta:

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

Pero eso no inicia el números de un dígito con un cero como yo quiero: 01, 02, 03, 04 , 05, 06, 07, 08, 09, 10 y así sucesivamente ..

que incluso han intentado esto, pero no funcionó:

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

Cualquier persona que sabe cómo conseguir Rango para empezar ¿ceros a la izquierda? O cualquier otra forma de hacer esto por lo que se puede utilizar en la validación ?:

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

Respuesta

16

El problema es que los números mismos don No tienen ceros a la izquierda (o, alternativamente, tienen un número infinito de ceros a la izquierda que nunca se imprimen). Para obtener ceros a la izquierda, necesitas cadenas. Afortunadamente, Ruby viene con este tipo de formato de cadenas de capacidad incorporada.

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

El %02d es un especificador de formato que significa "almohadilla con ceros a la izquierda si es menos de dos dígitos."

Para la validación, se tendrá que hacer la misma conversión:

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

(. Gracias a @ r-dub por señalar que el bit)

+2

Probablemente debería agregar la declaración de validación correcta a su respuesta para completarla. validates_inclusion_of: birthmonth,: in => (1..12) .map {| n | "% 02d"% n} – rwilliams

+0

No validará cuando elijo un número que comienza con un cero. Los números que comienzan con uno validan – Lisinge

+0

Agregue la línea de validación que puse en mi último comentario y debería funcionar bien. Su validación actual no tiene los mismos valores que Chuck puso en su respuesta para el cuadro de selección. – rwilliams

0

números de relleno Probar que son menos de 10, así:

= f.select(:birthmonth, options_for_select((1..12).collect{ |i| i < 10 ? "0#{i}" : i })) 
+0

Gracias! ¿Puedo usar eso en la validación? – Lisinge

+0

Como resultado de este truco, tendrá tipos mixtos en la matriz resultante, algunos de los elementos convertidos en cadenas y otros en enteros. Aunque probablemente no causaría ningún problema en este caso particular, este tipo de pirateo no debería considerarse como una opción, al menos no en Ruby (esto parece un hábito de PHP para mí). –

+0

entonces, ¿cómo debería hacerlo? – Lisinge

2

Si es sólo una cuestión de presentación, se puede construir [de texto, valor] pares y pasarlos a options_for_select:

Dado un contenedor en el que los elementos responden a primera y última (tal como una serie de dos elementos), el "dura" sirven como valores de opción y los "primeros" "como texto de opción.

Por lo tanto, algo así como:

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

De esa manera usted debería ser capaz de mantener su lógica de validación de inmediato.

+0

+1 Probablemente la mejor respuesta, aunque un poco tarde para la fiesta. – rwilliams

2

Usando rjust haría más fácil y más bonita que supongo:

(1..12).collect{ |i| i.to_s.rjust(2,'0') } 
13

Usted puede simplemente hacer: '01'..'12'

Cuestiones relacionadas