在Rails中,如何将毫秒字段映射到小时、分钟和秒字段?

In Rails, how do I map a millisecond field to hours, minutes, and seconds fields?

我正在使用 Rails 4.2.3。在我的模型中,我有一个字段记录某人做某事所花费的时间。它是一个名为“time_in_ms”的字段,它是我的 PostGresql 数据库中的一个整数。我的问题是,在我的表单中,我不希望用户必须以毫秒为单位输入,我宁愿让他们从小时、分钟和秒中输入 select。如何在我的 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”字段正确编写和预填充 selectOR?

谢谢,-戴夫

由于你没有提到你的控制器,我假设控制器是 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

我已经离开了验证部分。您可以在客户端和服务器端实现它。