2010-02-18 30 views
5

Sử dụng Ruby on Rails, tôi đang điền vào 'chọn' với số lần sử dụng một số gia tăng nhất định, chẳng hạn như cứ 30 phút một lần. Hiện tại tôi đang viết ra tất cả các khả năng trong một tệp YAML, nhưng tôi cảm thấy như có một cách chậm chạp. Tôi nghĩ rằng tôi muốn cung cấp một start_time, một end_Time, một gia tăng, và hiện tại chỉ là một tùy chọn nữa gọi là 'Closed' (nghĩ 'business_hours'). Vì vậy, tôi chọn hiển thị sức mạnh:Điền một lựa chọn với hàng loạt lần theo gia số, cộng với các tùy chọn bổ sung

'đóng'

5:00 am

5:30 am

6:00 am

...

[ tất cả các cách để] ...

11:30 pm

Có ai có thể nghĩ cách tốt hơn để làm điều này hay chỉ là 'đánh vần' tất cả chúng một cách tốt nhất?

Trả lời

13

Câu trả lời này dựa trên câu trả lời @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 

Bạn có thể sử dụng nó theo cách này:

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

Để thêm sử dụng "Closed":

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

Bạn cũng có thể vượt qua :increment => 15.minutes - theo mặc định nó được thiết lập để 30.minutes.

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

Thay vì một <select> bạn có thể xem xét sử dụng HTML5 loại time đầu vào:

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

Kể từ khi time đầu vào là chỉ có sẵn trong HTML5 (trên thực tế, chỉ có Opera hỗ trợ nó cho đến nay), bạn sẽ muốn có một cách để các trình duyệt khác sử dụng nó. Tôi đã yêu cầu một số question về cách thực hiện tương tự cho yếu tố <input type='range'>.

Các vấn đề liên quan