Заполнение выбора с шагом в несколько раз, плюс дополнительные опции - PullRequest
5 голосов
/ 18 февраля 2010

Используя Ruby on Rails, я заполняю 'select' временами с заданным шагом, например каждые 30 минут. В настоящее время я записываю все возможности в файл YAML, но я чувствую, что есть более приятный способ. Я думаю, что хочу предоставить start_time, end_time, инкремент, и в настоящее время просто еще одну опцию, называемую «Closed» (подумайте «business_hours»). Таким образом, мой выбор может отображать:

«Закрыто»

5: 00 утра

5: 30 утра

6: 00 утра

...

[вплоть до] ...

11: 30 pm

Кто-нибудь может придумать лучший способ сделать это, или просто «прописать» их всех наилучшим образом?

Ответы [ 3 ]

13 голосов
/ 18 февраля 2010

Этот ответ основан на ответе @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

Вы можете использовать его следующим образом:

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

Чтобы добавить «Закрыто», используйте:

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

Вы также можете передать :increment => 15.minutes - по умолчанию установлено значение 30.minutes.

8 голосов
/ 18 февраля 2010
["closed"] + Array.new(24.hours / 30.minutes) do |i|
  (Time.now.midnight + (i*30.minutes)).strftime("%I:%M %p")
end
0 голосов
/ 18 февраля 2010

Вместо <select> вы можете рассмотреть возможность использования типа ввода HTML5 time:

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

Поскольку ввод time доступен только в HTML5 (на самом деле, пока только Opera поддерживает его), вы захотите, чтобы другие браузеры могли его использовать.Я задал вопрос о том же, что и для элемента <input type='range'>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...