使用sse在rails 4上的ruby中进行异步响应

aya*_*ing 9 asynchronous ruby-on-rails live-streaming server-sent-events ruby-on-rails-4

我想用在轨4.服务器发送的事件我已阅读关于它的大文章.尽管如此,它没有提到如何使用一种方式来设置事件发生时触发的回调.我需要能够在模型中进行更改后立即通过SSE连接推送到客户端.我想将这些更改推送给任何与我有开放SSE连接的用户.基本上我需要知道如何在rails 4中进行异步事件调用.此外,如果没有其他选择我可以轻松完成这样的任务吗?让我们说一个实时的聊天应用程序.

Ric*_*eck 6

如果您习惯使用第三方应用程序,则必须在Rails中使用ActionController :: Live,或者使用Pusher之类的东西:

教程

这里有一个非常好的教程


细节

创建"实时"功能更像是一个"螺栓固定"而不是Rails的本机功能集

您基本上必须通过Javascript连接到服务器的"频道",Rails将继续向该频道发送更新

问题是Rails通常处理HTTP请求(您发送请求,Rails提供响应).这给Rails带来了一个问题,因为异步性不在其核心设计范例中

您使用SEE或Websockets体验的实时连接根本不是实时连接 - 它只是一个永久连接.ActionController :: Live允许Rails在标准"HTTP"请求结构之上呈现请求


这个怎么运作

我认为实时功能是"永久的ajax"

与"标准"ajax一样,您可以直接从渲染页面发送请求(没有什么特别之处).和"标准"ajax一样,您还需要使用客户端引擎(Javascript)处理返回的数据

区别在于"标准"ajax,"实时"功能可以由服务器启动(因此SEE的相对突出):

class MessagingController < ApplicationController
  include ActionController::Live

  def send_message
    response.headers['Content-Type'] = 'text/event-stream'
    10.times {
      response.stream.write "This is a test Messagen"
      sleep 1
    }
    response.stream.close
  end
end
Run Code Online (Sandbox Code Playgroud)

这意味着连接到服务器"通道"的每个人都会收到更新(而不仅仅是在Ajax中接收更新的个人)


通道

创建"私人"实时功能的方法,你基本上需要使用"频道"

这些允许您将数据发送给特定的个人(用于私人消息等),使您可以创建更丰富的体验

  • 谢谢你的答案,但我已经在我的应用程序中有这么远了.我的问题是如何在后台运行该循环,如何在模型更改时触发它. (6认同)