В 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
Я оставил часть проверки. Вы можете реализовать это как на стороне клиента, так и на стороне сервера.