2010-04-21 14 views
5

Mam formularz, w którym moi użytkownicy mogą zarejestrować się na mojej stronie.Zasięg z wiodącym zerem w rubinie

Wypełniają swoją datę urodzenia w formie: wiek urodzenia, miesiąc urodzenia i urodziny.

Więc używam Zakres stworzyć select w postaci tak:

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

Ale to nie rozpocznie się pojedyncze numery cyfra jest zerem jak chcę: 01, 02, 03, 04 , 05, 06, 07, 08, 09, 10 i tak dalej ..

ja nawet nie próbował tego, ale to nie działa:

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

że ktoś wie jak dostać Zakres zacząć wiodące zera? Lub jakikolwiek inny sposób to zrobić, więc można go używać w walidacji ?:

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

Odpowiedz

16

Problem jest to, że same numery don nie ma wiodących zer (lub, alternatywnie, ma nieskończoną liczbę wiodących zer, które nigdy nie są drukowane). Aby uzyskać wiodące zera, potrzebujesz ciągów. Na szczęście, Ruby pochodzi z tego rodzaju możliwości formatowania tekstu zbudowany w.

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

%02d jest specifier formatowania, które oznacza „pad go wraz z wiodących zer, jeśli jest to mniej niż dwie cyfry.”

walidacji, trzeba zrobić to samo przekształcenie:

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

(. Dzięki @ R-dub za wskazanie, że bit)

+2

Powinieneś prawdopodobnie dodać poprawne oświadczenie do swojej odpowiedzi dla kompletności. validates_inclusion_of: birthmonth,: in => (1..12) .map {| n | "% 02d"% n} – rwilliams

+0

Nie będzie sprawdzania poprawności, gdy wybiorę liczbę rozpoczynającą się od zera. Liczby, które zaczynają się od jednego sprawdzania poprawności – Lisinge

+0

Dodaj wiersz sprawdzania poprawności, który umieściłem w moim ostatnim komentarzu i powinien działać poprawnie. Twoja aktualna walidacja nie ma takich samych wartości jak to, co Chuck włożył w swoją odpowiedź dla pola wyboru. – rwilliams

0

numery Spróbuj wypełniające, które są mniej niż 10, na przykład:

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

Dziękujemy! czy mogę użyć tego w walidacji? – Lisinge

+0

W wyniku tego hackowania, w wynikowej tablicy pojawią się typy mieszane, niektóre elementy zostaną przekształcone w łańcuchy, a pozostałe w postaci liczb całkowitych. Chociaż prawdopodobnie nie spowodowałoby to żadnego problemu w tym konkretnym przypadku, tego rodzaju hakowanie nie powinno być nigdy uważane za opcję, przynajmniej nie w Ruby (to wygląda dla mnie jak przyzwyczajenie do PHP). –

+0

, więc jak mam to zrobić? – Lisinge

2

Jeśli jest to tylko kwestia prezentacyjny, można skonstruować [tekst, wartość] pary i przekazuje je do options_for_select:

względu pojemniku, w którym elementy odpowiedzi na pierwszą i ostatnią (takie jak wybór dwóch elementów), przy czym „trwa” służyć jako wartości opcji i "pierwsze "jako tekst opcji.

Tak, coś takiego:

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

ten sposób powinieneś być w stanie utrzymać swoją logikę walidacji, jak jest.

+0

+1 Prawdopodobnie najlepsza odpowiedź, choć trochę spóźniona na imprezę. – rwilliams

2

Korzystanie rjust byłoby łatwiej i ładniej Chyba:

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