在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
我已经离开了验证部分。您可以在客户端和服务器端实现它。
我正在使用 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
我已经离开了验证部分。您可以在客户端和服务器端实现它。