【问题标题】:How to share variable value between requests in Rails?如何在 Rails 中的请求之间共享变量值?
【发布时间】:2019-02-06 15:34:01
【问题描述】:

我正在使用 Ruby on Rails 4.2。在控制器中,我有一种方法需要花费大量时间才能完成一些繁重的计算。我想通知用户计算进度。我的想法是让@progress 变量在计算期间更新,并由处理来自前端的 AJAX 请求的不同操作读取。但是这个想法失败了——当变量以长方法更新时,我总是在 AJAX 操作中使用默认的 0 值。我已经尝试过@@progress、$progress 和 session[:progress],但结果完全相同。 现在我正在考虑制作一个模型来存储数据库中的进度并从那里读取它,但我不敢相信它不能通过一些更简单的方式来完成。 请分享您的想法!

【问题讨论】:

  • 看来您需要后台作业和 ActionCable
  • 会不会比只为此目的提供一个特殊模型更简单?
  • 不是简单,而是正确

标签: ruby-on-rails ajax


【解决方案1】:

理论:

对于这些情况,通常的方法是从 HTTP 处理程序进程异步执行作业(因此最终用户不会等待来自网络服务器的响应太久)。

这意味着:

  1. 将繁重的工作委派给后台工作,
  2. 以某种方式让客户端知道工作何时完成(此处有 2 个选项)。

实用(上述理论在 Rails 应用程序上下文中的应用):

  1. 后台作业:rails 社区提供了各种各样的 gem(+ 内置解决方案 ActiveJob)来执行异步作业(= 后台任务)。它们可以分为两大类:
  • persisted 状态:以当前状态在磁盘上写入文件,以便在服务器重新启动时可以恢复队列(DelayedJobQue
  • 内存中状态:通常更快,但如果服务器重启,队列会丢失(ResqueSidekiq
  1. 表面到客户端: 这里有两个主要选项:
  • 轮询:客户端每 X 秒调用一次后端的 AJAX 以检查后台作业是否完成
  • 订阅通过网络套接字:客户端通过网络套接字连接到服务器并监听工作完成时触发的事件(例如:@Vasilisa 指出的ActionCable

基于意见:

如果你想保持简单,我会采用一个非常简单的实现:Resque 用于后端,而轮询系统用于前端。

如果您想要完整的东西,能够抵抗服务器重新启动并将队列恢复到崩溃前的位置,我会使用持久化版本(例如DelayedJob)或使用您自己的持久化逻辑包装内存解决方案.

【讨论】:

  • 我在我的项目中使用它。很好的解释! :)
猜你喜欢
  • 2022-06-26
  • 2013-04-12
  • 2014-03-23
  • 2013-06-10
  • 2017-11-19
  • 2021-01-27
  • 2017-01-05
  • 2021-11-03
相关资源
最近更新 更多