2010-04-21 3 views
5

Ich habe ein Formular, wo meine Benutzer auf meiner Website registrieren können.Bereich mit führender Null in Ruby

Sie geben ihr Geburtsdatum in der Form Geburtsjahr, Geburtsmonat und Geburtstag ein.

So Reichweite Ich bin mit dem select in Form wie diese zu erstellen:

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

Aber das beginnt nicht die einstelligen Zahlen mit einem Null wie ich will: 01, 02, 03, 04 , 05, 06, 07, 08, 09, 10 und so weiter ..

ich habe dies auch versucht, aber es hat nicht funktioniert:

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

Jeder, der weiß, wie Reichweite, um zu beginnen führende Nullen? Oder jede andere Art und Weise, dies zu tun, damit ich es in die Validierung verwenden ?:

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

Antwort

16

Das Problem ist, dass die Zahlen sich don keine führenden Nullen (oder alternativ eine unendliche Anzahl von führenden Nullen, die niemals gedruckt werden). Um führende Nullen zu erhalten, benötigen Sie Strings. Glücklicherweise kommt Rubin mit dieser Art von String-Formatierung Fähigkeit eingebaut.

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

Die %02d ist eine Formatierungs Spezifizierer, das bedeutet „pad es mit führenden Nullen, wenn es weniger als zwei Ziffern.“

Zur Validierung, müssen Sie die gleiche Umwandlung tun:

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

(. Dank @ r-dub für dieses Bit Hinweis auf)

+2

Sie sollten Ihrer Antwort wahrscheinlich die korrekte validates-Anweisung hinzufügen, um sie zu vervollständigen. validates_inclusion_of: Geburtsmonat,: in => (1..12) .map {| n | "% 02d"% n} – rwilliams

+0

Es wird nicht validiert, wenn ich eine Zahl wähle, die mit einer Null beginnt. Zahlen, die mit einer Validierung beginnen, obwohl – Lisinge

+0

Fügen Sie die Validierungszeile hinzu, die ich in meinen letzten Kommentar eingegeben habe, und es sollte gut funktionieren. Ihre aktuelle Validierung entspricht nicht den Werten, die Chuck in seiner Antwort für die Auswahlbox eingegeben hat. – rwilliams

0

Try padding Zahlen, die weniger als 10, wie folgt aus:

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

Dank! Kann ich das bei der Validierung verwenden? – Lisinge

+0

Als Ergebnis dieses Hacks haben Sie gemischte Typen im resultierenden Array, einige der Elemente werden in Strings umgewandelt, andere als ganze Zahlen. Obwohl es in diesem speziellen Fall wahrscheinlich kein Problem verursachen würde, sollte diese Art von Hacking niemals als Option betrachtet werden, zumindest nicht in Ruby (das sieht für mich wie PHP aus). –

+0

also wie soll ich es tun? – Lisinge

2

Wenn es nur ein Präsentations-Thema ist, Sie können [text, value] Paare konstruieren und sie an options_for_select:

einen Behälter gegeben, in dem die Elemente, die erste und die letzte (wie etwa ein zwei-Element-Array), das „hält“ dienen als Optionswerte reagieren, und die "Ersten "als Optionstext.

Also, so etwas wie:

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

Auf diese Weise sollten Sie in der Lage sein, Ihre Validierungslogik zu halten, wie ist.

+0

+1 Wahrscheinlich die beste Antwort, obwohl ein wenig zu spät zur Party. – rwilliams

2

rjust Verwendung wäre es einfacher machen und schöner Ich denke:

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

können Sie eigentlich nur tun: '01'..'12'