1

我计划使用 SSE 更新显示 Stripe 订阅详细信息的页面。

基本上它是这样的:

  1. 加载订阅详情页面
  2. 使用 ActiveJob 作业从 Stripe API 请求订阅详细信息
  3. 任务完成后,使用 SSE 通知该客户端(订阅页面)将对页面进行更新
  4. 通过 javascript 执行更新

我有步骤 1、2 和 4 的代码设置,但是,我不知道如何执行 #3。

我看到的问题之一是 ActiveJob 确实有一个 after_perform 回调,但是 Rails 中内置的 SSE 驻留在控制器上(ActionController::Live::SSE)。我不知道如何在 after_perform 回调的 SSE 控制器中执行某些操作。

谷歌搜索,我发现了一个潜在的解决方案:

  1. 使用 Sidekiq 插件可以判断任务何时完成。
  2. 使用 PostgreSQL 通知/监听

我不知道之后会发生什么,比如 SSE 控制器如何知道任务已执行。

其他注意事项:

我正在使用 Brandon Hilkert 的 Sucker Punch gem 进行后台处理:https ://github.com/brandonhilkert/sucker_punch

我还想要一个不会强迫我坚持使用 PostgreSQL 专有代码的解决方案。但是,我不介意这是否是唯一可行的方法。

我还发布了一个 Sidekiq 解决方案,以防我无法使用 Sucker_punch 做到这一点而不得不切换到 Sidekiq。

有任何想法吗?

谢谢!

4

1 回答 1

1

Rails 5 中的 Action Cable 就是为这种类型的功能而构建的。 https://github.com/rails/rails/tree/master/actioncable

Action Cable 将 Web 套接字带入 Rails,这意味着客户端和服务器之间的持久连接。您可以从客户端 (javascript/coffescript) 执行操作并将 json 甚至 html 部分更新推送回客户端。从 dhh 教程https://www.youtube.com/watch? v=n0WUjGkDFS0

生成新频道rails g channel并设置广播范围

def subscribed
  stream_from "subscription_#{current_user.id}"
end

在您的情况下,步骤 1 和 2 保持不变。在第 3 步结束时,我会添加ActionCable.server.broadcast "subscription_#{current_user.id}", status: payment_status. 第 4 步。按照您的意愿更新客户端的状态。

于 2016-05-09T19:05:07.857 回答