我需要创建一个基于时间的倒计时模型属性,以便我可以在视图中调用它,如
<%=Merge.timer%>
并输出如下:
#22:39
#22:38
#22:37...
我有合并作为模型,可能有也可能没有很多条目,在我看来我必须打电话
<%merge_lists.each do |i|%>
<%end%>
所以对于每个merge
,我希望倒计时到期。这实际上取决于创建merge
的时间。假设每个merge
每个持续7小时。
答案 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
中提供此地址。