2010-02-18 3 views
5

En utilisant Ruby on Rails, je remplis un 'select' avec des temps en utilisant un incrément donné, comme toutes les 30 minutes. Actuellement, je suis en train d'écrire toutes les possibilités dans un fichier YAML, mais j'ai l'impression qu'il y a une façon plus fluide. Je pense que je veux fournir un start_time, un end_time, un increment, et actuellement juste une autre option appelée 'Closed' (pensez 'business_hours'). Donc, mon écran de sélection pourrait:Remplir une sélection avec une série de fois par incréments, plus des options supplémentaires

'Closed'

05h00

05h30

06h00

...

[ tout le chemin à] ...

23h30

Quelqu'un peut-il penser à une meilleure façon de le faire, ou est tout simplement « l'orthographe » tous la meilleure façon?

Répondre

13

Cette réponse est basée sur @emh answer.

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 

Vous pouvez l'utiliser de cette façon:

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

Pour ajouter une utilisation "Fermé":

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

Vous pouvez également passer :increment => 15.minutes - par défaut, il est réglé sur 30.minutes.

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

Au lieu d'un <select> vous pouvez envisager d'utiliser le type d'entrée HTML5 time:

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

Depuis l'entrée time est seulement disponible en HTML5 (en effet, seul Opera supporte jusqu'à présent), vous aurez besoin d'un façon pour les autres navigateurs de l'utiliser. J'ai demandé à un question de faire la même chose pour un élément <input type='range'>.