2010-02-18 4 views
5

Mit Ruby on Rails, fülle ich eine 'Auswahl' mit Zeiten in einem bestimmten Inkrement, wie alle 30 Minuten. Momentan schreibe ich alle Möglichkeiten in einer YAML-Datei, aber ich habe das Gefühl, dass es einen besseren Weg gibt. Ich denke, ich möchte eine start_time, eine end_time, ein Inkrement und derzeit nur eine weitere Option namens "Closed" (denke 'business_hours') bereitstellen. Also, meine wählen Macht Anzeige:Füllen einer Auswahl mit einer Reihe von Malen in Inkrementen plus zusätzliche Optionen

5:00 Uhr morgens

05.30

06.00

... 'Geschlossen'

[ den ganzen Weg bis] ...

23.30

jemand denken kann dies auf eine bessere Art und Weise zu tun, oder ist nur ‚Rechtschreibung‘ alles Gute Ausweg?

Antwort

13

Diese Antwort basiert auf @emh Antwort.

def create_hours(parameters) 
    start_time = parameters[:start_time] ? parameters[:start_time] : 0 
    end_time = parameters[:end_time] ? parameters[:end_time] : 24.hours 
    increment = parameters[:increment] ? parameters[:increment] : 30.minutes 
    Array.new(1 + (end_time - start_time)/increment) do |i| 
    (Time.now.midnight + (i*increment) + start_time).strftime("%I:%M %p") 
    end 
end 

Sie können es auf diese Weise verwenden:

create_hours(:start_time => 5.hours, :end_time => 23.hours) 
=> ["05:30 AM", "06:00 AM", "06:30 AM", "07:00 AM", "07:30 AM", "08:00 AM", 
    "08:30 AM", "09:00 AM", "09:30 AM", "10:00 AM", "10:30 AM", "11:00 AM", 
    "11:30 AM", "12:00 PM", "12:30 PM", "01:00 PM", "01:30 PM", "02:00 PM", 
    "02:30 PM", "03:00 PM", "03:30 PM", "04:00 PM", "04:30 PM", "05:00 PM", 
    "05:30 PM", "06:00 PM", "06:30 PM", "07:00 PM", "07:30 PM", "08:00 PM", 
    "08:30 PM", "09:00 PM", "09:30 PM", "10:00 PM", "10:30 PM", "11:00 PM"] 

auf "geschlossen" Add:

["closed"] + create_hours(:start_time => 5.hours, :end_time => 23.hours) 

Sie auch :increment => 15.minutes passieren kann - standardmäßig wird auf 30.minutes.

8
["closed"] + Array.new(24.hours/30.minutes) do |i| 
    (Time.now.midnight + (i*30.minutes)).strftime("%I:%M %p") 
end 
0

Statt eines <select> Sie sich anschauen sollten die HTML5 time Eingabetyp mit:

<input type='time' min='05:30' max='23:30' step='00:30' /> 

Da der time Eingang ist nur in HTML5 verfügbar (in der Tat nur Opera unterstützt es bis jetzt), sollten Sie eine Möglichkeit für andere Browser, es zu benutzen. Ich fragte eine question über die gleiche Sache für ein <input type='range'> Element.

Verwandte Themen