DateTime.now设置变量时延迟(Rails)

时间:2014-05-30 17:56:27

标签: ruby-on-rails datetime

我创建了一个具有计时器功能的应用程序,您可以在其中启动,暂停/恢复和完成。我有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 %>

我感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

<强> 1。选项 在用户点击链接后,您可能应该使用javascript时间并将其设置为参数。

d = new Date
d.toISOString()
// => "2014-05-30T18:54:59.092Z"

但是你必须小心设置正确的时区。 toISOString以UTC格式返回日期。而javascript方式还有一个问题。你不知道他的本地机器上有什么时间用户,所以它可能有问题。

<强> 2。选项 您不必将时间设置为暂停链接。当暂停链接的请求到达时,为什么不在服务器上设置暂停时间?我认为这是更好的解决方案。