Rails在模型中创建秒表参数

时间:2017-03-18 16:42:23

标签: ruby-on-rails ruby models

我需要创建一个基于时间的倒计时模型属性,以便我可以在视图中调用它,如

<%=Merge.timer%>

并输出如下:

#22:39
#22:38
#22:37...

我有合并作为模型,可能有也可能没有很多条目,在我看来我必须打电话

<%merge_lists.each do |i|%>
<%end%>

所以对于每个merge,我希望倒计时到期。这实际上取决于创建merge的时间。假设每个merge每个持续7小时。

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说,我将结束时间存储在数据库中并计算方法中的剩余时间。

要存储时间,您可以使用时间戳。

rails g model merge end_time:timestamp

或者,如果您已经创建了模型......

rails generate migration add_end_time_to_merge end_time:timestamp

您可以使用Time对象计算结束时间,可以按如下方式创建。您需要在创建每个Merge时执行此操作,这可能位于控制器中。

@merge.end_time = 6.hours.since # for some reason, this means 7. 

计算剩余时间的代码应该放在模型中。

class Merge < ApplicationRecord
  def time_remaining
    Time.at(end_time - Time.now)
  end

  def timer
    time_remaining.strftime("%H:%M:%S")
  end
end

timer方法输出字符串中剩余的时间,例如"06:49:23"

最大的问题是如何在视图文件中继续更新它。 Ruby只运行一次 - 在页面到达用户之前。为了不断更新,您需要使用一些JS。

function updateTime() {
  var address = "<%= @address_to_time %>";
  $.get(address, function(data) {  // Send Ajax request
    $("#time").html(data);         // Update contents of container
    updateTime();                  // Repeat when finished
  });
}
updateTime();

您可以通过部分提供时间,这只会使HTML显示时间。在@address_to_time中提供此地址。