2010-02-18 7 views
5

Usando Ruby on Rails, estoy llenando un 'seleccionar' con tiempos usando un incremento dado, como cada 30 minutos. Actualmente estoy escribiendo todas las posibilidades en un archivo YAML, pero siento que hay una manera más suave. Estoy pensando que quiero proporcionar un start_time, un end_time, un incremento, y actualmente solo una opción más llamada 'Closed' (piensa 'business_hours'). lo tanto, mi pantalla de selección de fuerza:Rellenar una selección con una serie de veces en incrementos, más opciones adicionales

'cerrado'

5:00 am

5:30 am

6:00 am

...

[ todo el camino a] ...

11:30 pm

¿Alguien puede pensar en una mejor manera de hacerlo, o simplemente está 'deletreando' de la mejor manera?

Respuesta

13

Esta respuesta se basa en la respuesta @emh.

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 

Usted puede usarlo de esta manera:

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"] 

Para añadir uso "Cerrado":

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

También puede pasar :increment => 15.minutes - de forma predeterminada se establece en 30.minutes.

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

En lugar de un <select> es posible considerar el uso del HTML5 tipo time de entrada:

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

Desde la entrada time está disponible sólo en HTML5 (de hecho, la única ópera que soporta hasta ahora), usted querrá una camino para que otros navegadores lo usen. Le pregunté a question sobre hacer lo mismo para un elemento <input type='range'>.

Cuestiones relacionadas