Rails 在模型中创建秒表参数

Rails create a stopwatch parameter in model

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

<%=Merge.timer%>

并且输出如下:

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

我将 Merge 作为一个模型,可能有也可能没有很多条目,在我看来我必须调用

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

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

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

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

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 中提供地址。