视图中的 CableReady 和 Rails 后台作业

视图中的 CableReady 和 Rails 后台作业

在 Ruby on Rails 应用程序中使用 CableReady 根据 Sidekiq 后台作业的进度动态更新页面和视图。

在 Web Dev 的世界中,处理长时间运行的方法的一种常见做法,通常也是更可取的方法,是将密集操作作为后台作业运行。这是一个简单而有效的解决方案,但就像我们网络程序员所面临的一切一样,后台工作有利也有弊。例如,在这项工作完成之前,用户通常不会收到任何反馈。对于我遇到的特定功能,我需要向用户显示一些前端反馈,并根据此方法的进度更改页面的内容。一种传统的方法是创建一条专用路线并 控制器#方法 , 每隔几秒执行一次 Ajax 调用;但是有一种更简单的方法。考虑到它有多大的瑞士军刀, 电缆就绪 是一个完美的工具。

在进一步讨论之前,让我先澄清一下 CableReady 的真正含义。以下是官网的一段话:

 CableReady 是 2017 年 5 月首次发布的 Ruby gem。它让你 **创造出色的实时用户体验** 通过触发客户端 DOM 更改、事件和通知[ 行动电缆](https://guides.rubyonrails.org/action_cable_overview.html) 网络套接字。

除了它使我们不必在 Rails 应用程序中编写过多的 Javascript 之外,CableReady 完全卖给我的一个方面如下,也来自他们的文档。

 与 Ajax 请求不同,操作并不总是由用户活动发起——甚至是用户的浏览器。

这意味着可以使用 CableReady 几乎无处不在 !在这种情况下,我们将在一个普通的旧红宝石对象中使用它—— 上门 .

在我们继续之前,我想指出一些事情。 CableReady 与 刺激反射 ,或者更准确地说,我将 StimulusReflex 与 CableReady 一起使用,因为它是直接依赖项。因此,CableReady 可以直接在 Reflex 类中调用,无需额外配置。 Reflex 将负责 CableReady 将广播到的频道。但是,要记住的一件事是,当在 Reflex 中调用 CableReady 时,CableReady 将向当前用户广播。

让我们从 CSV 导入器开始。 Ruby 中典型的 CSV 导入器可能看起来与此非常相似:

typical importer

虽然这可行,但它很无聊,在后台,并且隐藏在用户的视野之外。他们不知道他们的导入过程是否正在运行或他们所处的位置,所以让我们实时向用户展示其进度。首先,我将包括 CableReady::广播公司 在我们的 进口商 班级。

然后我们需要创建一个 行动电缆 频道类

…和一个频道订阅者。

现在,在每次页面加载时,消费者都会创建一个订阅 用户频道 .消费者订阅后 用户频道 , 这 _订阅_ 方法 用户频道 叫做。这将使用 stream_for 订阅广播,例如 用户:Z2lkOi8vYnJva2VyLXZpc2lvbi9Vc2VyOjpBZG1pbi8x, 这是从频道名称生成的名称( 用户 ) 和模型实例(当前用户的 GlobalID)。为了举例说明这一点,在日志中我们看到以下内容:

 [ActionCable] UserChannel 正在传输订阅确认  
 [ActionCable] UserChannel 正在从用户流式传输:Z2lkOi8vYnJva2VyLXZpc2lvbi9Vc2VyOjpBZG1pbi8x

从现在开始,我们可以使用这样的代码:

cable_ready[UserChannel].remove(selector: 'some_selector').broadcast_to(current_user)

…向当前用户广播。

现在我们在 PORO 中安装了 CableReady 并设置了通道,是时候重新审视我们的 进口商 班级;在这里,我们应该充实该方法,以跟踪已经处理了多少 CSV 行。

鉴于你有一个 div 选择器 id 为 处理的行号容器 在您看来,在每次 CSV 迭代中,数字都会增加以反映 柜台 多变的;所有都通过 CableReady 和 文本内容 DOM 操作(这很简单 Javascript 的 .textContent 财产)。

作为后端开发人员,这对我来说已经足够了,我会保持原样! 不过幸好我有一个 我团队的好朋友 谁知道关于设计的一两件事并用一个漂亮的 HTML 进度条实现它。

这对用户来说是一个很大的改进,但是我们如何找出我们还能做些什么呢?假设我们要从 西德基克 工作。

例如,想象一个显示某种排行榜的 Web 应用程序。在后台,每隔几分钟就会运行一次 rake 作业,以获取最新分数。使用 CableReady 也可以轻松地从该作业更新视图。

假设所有用户都可以访问此排行榜,则排行榜通道可能如下所示:

而不是使用 当前用户 和以前一样,我们使用字符串 “分数” .在日志中,它看起来与我们之前使用时完全不同 用户

 [ActionCable] LeaderboardChannel 正在传输订阅确认  
 [ActionCable] LeaderboardChannel 正在从 leaderboard:scores 流式传输

所以之前,当向 当前用户 ,这意味着只有一个用户可以看到该视图,因此大量字符串 ID 来自 用户:user_global_id .在这个排行榜示例中 排行榜:分数 ,广播将发布给所有登录的用户,这是我们这里的目标。

就像以前一样,需要创建频道订阅者,然后剩下的就是作业本身。

仅用几行代码,我们就实现了一个后台作业来更新我们的视图。挺酷的!而这只是冰山一角。正如所展示的,您几乎可以在任何地方使用 CableReady,因此您只受创造力的限制。使用 CableReady,您可以为您的 Rails 单体应用程序添加大量的反应性,同时保持简洁和简单的堆栈。

对我们在 eXp-Realty 如何拥抱 Rails 单体感兴趣? 本杰明·布罗斯特 (上述进度条的作者)开始了一个 关于它的系列博客文章。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/33342/20491310

posted @ 2022-09-13 10:21  哈哈哈来了啊啊啊  阅读(47)  评论(0编辑  收藏  举报