В Rails, как мне сопоставить поле миллисекунд с полями часов, минут и секунд?

Я использую Rails 4.2.3. В моей модели у меня есть поле, которое записывает количество времени, которое потребовалось кому-то, чтобы что-то сделать. Это поле с именем time_in_ms, которое является целым числом в моей базе данных PostGresql. Мой вопрос заключается в том, что в моей форме я не хочу, чтобы пользователь вводил данные в миллисекундах, я бы предпочел, чтобы они выбирали часы, минуты и секунды. Как мне установить это в моей форме Rails? Поскольку в моей модели таких полей нет, я не знаю, что добавить в мои атрибуты collection_select…

  <div class="field">
    <%= f.label "Time" %>
    <%= collection_select(:time_unit, :time_unit, @hours, {:prompt => true} ) %> hrs
    <%= collection_select(:time_unit, :time_unit, @minutes, {:prompt => true} ) %> min
    <%= collection_select(:time_unit, :time_unit, @seconds, {:prompt => true} ) %> sec
    <%= f.hidden_field :time_in_ms, :validate => true %>
  </div>

Как правильно написать и предварительно заполнить селекторы на основе моего единственного поля "time_in_ms" в моей модели?

Спасибо, Дэйв

1 ответ

Решение

Поскольку вы не упомянули свой контроллер, я предполагаю, что контроллером является TimersController. Вам необходимо внести изменения в представление, а также метод timer_params в контроллере.

Вот код на вид:

<div class="field">
    <%= f.label "Time" %>
    <%= select_tag('timer[hour]', options_for_select((1..12).to_a), {:prompt => 'Select Hour'} ) %> hrs
    <%= select_tag('timer[minute]', options_for_select((1..60).to_a), {:prompt => 'Select Minutes'} ) %> min
    <%= select_tag('timer[second]', options_for_select((1..60).to_a), {:prompt => 'Select Minutes'} ) %> sec
    <%#= f.number_field :time_in_ms %>
  </div>

и вот код на контроллере:

def create
    @timer = Timer.new(timer_params)

    respond_to do |format|
      if @timer.save
        format.html { redirect_to @timer, notice: 'Timer was successfully created.' }
        format.json { render :show, status: :created, location: @timer }
      else
        format.html { render :new }
        format.json { render json: @timer.errors, status: :unprocessable_entity }      
      end
    end
end


def timer_params
   # Main Code goes here
   params.require(:timer).permit(:time_in_ms)
   params[:timer][:time_in_ms] = (params[:timer][:hour].to_i * 60 * 60 + params[:timer][:minute].to_i * 60 + params[:timer][:second].to_i) * 1000
end

Я оставил часть проверки. Вы можете реализовать это как на стороне клиента, так и на стороне сервера.

Другие вопросы по тегам