我创建了一个具有计时器功能的应用程序,您可以在其中启动,暂停/恢复和完成。我有link_to按钮,用于设置启动,上次暂停,上次恢复和完成的时间。
问题在于,当用户点击暂停时发送调用以获取DateTime.now时,它会获取DateTime.now,用于页面最初加载时 而非比用户实际点击链接时。理想情况下,有一个解决方案可以在点击时获得实际的系统时间。一个可能的黑客是每隔x秒/分钟重新加载页面,以确保时间有点准确反映,但这似乎不是很干净。
要暂停的代码(paused_at是日期时间变量)
<%= link_to raw("<i class=\"glyphicon glyphicon-pause\"></i> Pause"), task_path(task, "task[paused_at]" => DateTime.now), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>
我提前为以下代码道歉,但这里是要点。用户可以设置[15,30,45,60,120]的分钟时间限制。如果您已经启动了任务但从未暂停过任务,则完成的数量只是从现在到开始时间之间的时间(task.started_at)。如果您暂停了它,那么完成的金额将从暂停到开始时间(=&gt; time_spent)。如果你已经恢复了,那就是从现在起到resumed_at加上time_spent的时间。按钮显示基于事物是否已经开始/暂停/恢复以及哪个时间更近。
<% if task.started_at != nil %>
<% if task.time_limit != nil %>
<div class="col-md-4">
<% if task.time_limit != 0 %>
<% @task_remain = (((task.started_at + task.time_limit * 60).to_time-DateTime.now.to_time)/60) %>
<% @task_remain_pc = @task_remain/task.time_limit*100 %>
<% @task_complete_pc = (1 - (@task_remain_pc/100))*100 %>
<% @task_remain_pc = @task_remain_pc.round(0) %>
<% @task_complete_pc = @task_complete_pc.round(0) %>
<% @task_remain = @task_remain.round(0) %>
<% if task.time_spent == nil %>
<% task.time_spent = 0 %>
<% end %>
<% if task.paused_at != nil %>
<% if task.resumed_at == nil %>
<%= task.paused_at %>
<%= task.started_at %>
<%= task.time_spent = (task.paused_at - task.started_at)/60 %>
<% @task_complete = task.time_spent %>
<% else %>
<% if task.paused_at < task.resumed_at %>
<%= @task_complete = (task.time_spent + (DateTime.now.to_time - task.resumed_at.to_time)/60) %>
<%= @task_complete_pc = (@task_complete/task.time_limit)*100 %>
<% else %>
<%= @task_complete = task.time_spent + ((task.paused_at - task.resumed_at)/60)%>
<%= @task_complete_pc = (@task_complete/task.time_limit)*100 %>
<% end %>
<% end %>
<% end %>
<% end %>
<% if @task_complete_pc < 50 %>
<div class="progress">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="@task_complete_pc" aria-valuemin="0" aria-valuemax="100" style="width: <%= @task_complete_pc %>%;">
</div>
</div>
<% elsif @task_complete_pc >= 50 && @task_complete_pc < 80 %>
<div class="progress">
<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="@task_complete_pc" aria-valuemin="0" aria-valuemax="100" style="width: <%= @task_complete_pc %>%;">
<%= @task_remain %>% left
</div>
</div>
<% elsif @task_complete_pc >= 80 && @task_complete_pc <= 100 %>
<div class="progress">
<div class="progress-bar progress-bar-danger" role="progressbar" aria-valuenow="@task_complete_pc" aria-valuemin="0" aria-valuemax="100" style="width: <%= @task_complete_pc %>%;">
<%= @task_remain %> min left
</div>
</div>
<% else %>
<!--listchange.js-->
<% @task_overby = (((task.started_at + task.time_limit * 60).to_time-DateTime.now.to_time)/60).round(0)*(-1) %>
<span class="label label-danger">
Over by
<% if @task_overby < 60 %>
<%= @task_overby %> min!
<% else %>
<%= (@task_overby/60).round(0) %> hr!
<% end %>
</span>
<% end %>
</div>
<% else %>
<div class="col-md-4">
</div>
<% end %>
<div class="col-md-4">
<div class="btn-group">
<% if task.paused_at == nil %>
<%= link_to raw("<i class=\"glyphicon glyphicon-pause\"></i> Pause"), task_path(task, "task[paused_at]" => DateTime.now), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>
<% elsif (task.paused_at != nil) && (task.resumed_at == nil) %>
<%= link_to raw("<i class=\"glyphicon glyphicon-play\"></i> Resume"), task_path(task, "task[resumed_at]" => DateTime.now), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>
<% elsif task.paused_at > task.resumed_at %>
<%= link_to raw("<i class=\"glyphicon glyphicon-play\"></i> Resume"), task_path(task, "task[resumed_at]" => DateTime.now), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>
<% elsif task.paused_at < task.resumed_at %>
<%= link_to raw("<i class=\"glyphicon glyphicon-pause\"></i> Pause"), task_path(task, "task[paused_at]" => DateTime.now), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>
<% end %>
<%= link_to raw("<i class=\"glyphicon glyphicon-refresh\"></i> Reset"), task_path(task, "task[started_at]" => DateTime.now), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>
<%= link_to raw("<i class=\"glyphicon glyphicon-ok\"></i> Done"), task_path(task, "task[done]" => true), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>
</div>
</div>
<% end %>
<% if task.started_at == nil %>
<div class="col-md-4">
</div>
<div class="col-md-4">
<div class="btn-group">
<%= link_to raw("<i class=\"glyphicon glyphicon-play\"></i> Start"), task_path(task, "task[started_at]" => DateTime.now), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>
<%= link_to raw("<i class=\"glyphicon glyphicon-ok\"></i> Done"), task_path(task, "task[done]" => true), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>
</div>
</div>
<% end %>
我感谢任何帮助。谢谢!
答案 0 :(得分:1)
<强> 1。选项强> 在用户点击链接后,您可能应该使用javascript时间并将其设置为参数。
d = new Date
d.toISOString()
// => "2014-05-30T18:54:59.092Z"
但是你必须小心设置正确的时区。 toISOString
以UTC格式返回日期。而javascript方式还有一个问题。你不知道他的本地机器上有什么时间用户,所以它可能有问题。
<强> 2。选项强> 您不必将时间设置为暂停链接。当暂停链接的请求到达时,为什么不在服务器上设置暂停时间?我认为这是更好的解决方案。