Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中服务器端的计时器_Ruby On Rails_Timer_Background - Fatal编程技术网

Ruby on rails Rails中服务器端的计时器

Ruby on rails Rails中服务器端的计时器,ruby-on-rails,timer,background,Ruby On Rails,Timer,Background,我努力实现的目标是: 1.用户按下按钮并启动限时表单。 2.计时器启动。 3.X时间过后,当计时器达到0且用户未完成表单时,rails在数据库中创建一条记录并执行一些会话清理操作(Model.create和session.delete) 如果用户启动表单然后变得不可用(关闭web浏览器或关闭PC),此计时器将像安全措施一样工作 你能给我指一下正确的方向吗?我应该从哪里开始?我应该使用什么语言/框架来实现这一点?您可以使用时间戳来记录发生的事情。Rails在updated\u at和created

我努力实现的目标是: 1.用户按下按钮并启动限时表单。 2.计时器启动。 3.X时间过后,当计时器达到0且用户未完成表单时,rails在数据库中创建一条记录并执行一些会话清理操作(Model.create和session.delete)

如果用户启动表单然后变得不可用(关闭web浏览器或关闭PC),此计时器将像安全措施一样工作


你能给我指一下正确的方向吗?我应该从哪里开始?我应该使用什么语言/框架来实现这一点?

您可以使用时间戳来记录发生的事情。Rails在
updated\u at
created\u at
字段中已经有了一个很好的例子

您可以重复使用此概念来存储用户首次开始填写表单的时间,可能是在资源的
new
路径上,该路径通常与表单的打开时间一致

至于执行清理,您有两个选项,它们甚至可以一起工作,具体取决于具体情况:

  • 如果清理对安全性不敏感,可以在前端启动计时器,然后在计时器过期时向后端发送AJAX请求
  • 如果清理对时间不敏感,可以每隔几分钟左右执行一次,这将对尚未清理的任何窗体执行清理。它将查看时间戳来确定这一点
  • 除了这些建议之外,我们还需要更多地了解您的用例,以回答更多的问题

  • 清理对时间敏感吗
  • 清理安全敏感吗
  • 有更多选项-您可以更精确或更安全地运行任务

    时间紧迫 如果您的时间非常紧迫(低至秒),一个选项是实现上述两个选项,此外还包括以下功能:

  • 使用ActionCable向用户打开web套接字。定期让他们ping服务器以检查其状态
  • 在过滤器之前的
    中,可能在
    应用程序控制器中,首先检查他们是否有继续操作的权限,即时间戳尚未过期。如果时间戳已过期,但尚未执行清理,请立即执行
    这种方法的局限性:

  • 如果用户完全关闭网站,则在执行下一个清理任务之前,不会进行清理
  • 前端存在漏洞。用户可以禁用前端检查,然后避免提交表单,这将以与#1相同的方式延迟清理
    它是时间敏感的。用户有精确的X分钟数,然后rails创建一个记录。问题是,即使用户不在,它也必须运行,所以我必须依赖服务器端计时器。把它想象成有时间限制的测验。用户启动它,并有15分钟来完成它,否则他会得到0。如果他离开电脑(或关闭网络浏览器)或在这15分钟内忘记提交表格,他将得到0。时间敏感度如何?5分钟的余量可以接受吗?一分钟?或者我们说的是秒?秒,它应该尽可能接近计划时间。我在上面的答案中添加了一个附加选项。请阅读并告诉我你的想法。