Используя select_tag, чтобы часы и минуты были вместе, как бы я отнес это к тому дню? - PullRequest
0 голосов
/ 14 марта 2012

Мне не нравится встроенный в Rails выбор даты, когда вы можете выбирать часы, секунды и минуты.Мне бы хотелось, чтобы часы и минуты повторялись с шагом в полчаса.Вот так:

def time_selection
  options = []
  48.times do |i|
    time = DateTime.now.beginning_of_day + (i*30.minutes)
    options << [time.strftime('%I:M %p'), time.strftime('%I:M %p')]
  end
  options_for_select(options, "[:scheduled_at(4i)]")
end

Тогда мой HTML:

.formRowTask
  = f.label :scheduled_at, "Date"
  = f.date_select :scheduled_at, :start_year => 1.year.ago.year, :end_year => 15.years.from_now.year
.formRowTask
  .time-selection-container
    = select_tag :sheculed_at, time_selection, :class => "duration_unit time-selection"

Но теперь я хотел бы убедиться, что это время правильно распределено с другим окном выбора, где пользователи могут выбрать дату,И дата, и время идут вместе с атрибутом [:scheduled_at].

Мой вопрос: как бы я связал эту информацию с датой, чтобы это было время-дата?

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Я думаю, что есть несколько приемлемых решений для этого. Лично я хотел бы создать два виртуальных атрибута в модели: «schedule_date» и «schedule_time», чтобы использовать их в вашем представлении, а затем в обратном вызове (например, before_save) анализировать каждый для создания DateTime schedule_at для сохранения в БД.

пример: я не знаю, как на самом деле выглядят ваши данные, когда они попадают в модель, но если запланированная дата пришла как «% m /% d /% Y», а время как «% I:% M% p» Ваша модель и метод в обратном вызове могут выглядеть следующим образом:

attr_accessor :scheduled_date, :scheduled_time #to use in your view

before_save :set_scheduled_at  #to parse both items into one attribute

def set_scheduled_at
  self.scheduled_at = DateTime.strptime("#{scheduled_date}-#{scheduled_time}", '%m/%d/%Y-%I:%M %p')
end
0 голосов
/ 14 марта 2012

Если вы хотите сделать это правильно, рассмотрите возможность установки обезьяны DateTimeSelector .

Если вы хотите быстрое и грязное решение, просто убедитесь, что ваши входные данные для часов и минут имеют одинаковые именакак date_select создает, но с (4i) для часов, (5i) для минут и (6i) для секунд.

Так, например, если ваш объект является экземпляром Task, форма имеетчтобы быть таким:

<div class="formRowTask">
  <label for="task_scheduled_at">Date</label>
  <select id="task_scheduled_at_3i" name="task[scheduled_at(3i)]">...</select>
  <select id="task_scheduled_at_2i" name="task[scheduled_at(2i)]">...</select>
  <select id="task_scheduled_at_1i" name="task[scheduled_at(1i)]">...</select>
</div>
<div class="formRowTask">
  <div class="time-selection-container">
    <select name="task[scheduled_at(4i)]">...</select>
    <select name="task[scheduled_at(5i)]">...</select>
  </div>
</div>

Как передать name параметр, опять же, зависит.Вы можете написать специальный помощник для этого или просто передать:

select_tag :scheduled_minutes, time_selection, :name => 'task[scheduled_at(4i)]' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...