ruby-on-rails - 如何在rails 3中实时推送内容

标签 ruby-on-rails real-time server-sent-events observers

我想知道如何在我的网站中实时推送内容..
我研究了一段时间,我意识到有很多方法可以完成这项工作。

先考虑几点:
我有一个带有一些社交功能的 Rails 3 应用程序。我想要实现的功能之一是在创建新事件时通知我的用户。
我的第一个方法是实现 SSE以及在上次加载事件后在数据库中搜索新注册表的 Controller 。

这可以工作,但是当我需要在创建新事件时将事件推送给所有事件用户(与该事件相关)时,这需要太多数据库查询,而无需进行数据库查询。

我的第二种方法是创建一个指向 Controller 的路由和一个观察者,以便在创建新事件时捕获,然后将创建的当前事件传递给 Controller ​​,最后通过 SSE 呈现事件的部分内容。

我的问题来了..如何将观察者与 Controller 连接起来并将当前要渲染的事件传递给它?
在那里,我可以使用另一种 Controller 类型,例如金属 Controller 甚至抽象 Controller 吗?

在这一点上,我意识到这可能是完成这项工作的另一种方法。
如果我能找到一种方法来做到这一点而不必用另一种语言或框架开发它,那就太好了。我认为应该有一个可以更轻松地完成实时应用程序的 gem 。
你觉得怎么样??我走在正确的道路上,或者我应该做些什么来实现这一目标?
非常感谢!!

最佳答案

Rails 3.0+ 使用 PubNub 实时推送内容

正如您所说,为了在您的网站或 Web 应用程序上使用某些社交功能安全可靠地向您的用户推送实时更新,有许多可用选项和许多细微差别也需要考虑。 这有一个 gem ! 我将通过在此处为您的 Rails 3.0+ 应用程序和网站提供简单的入门指南来帮助您入门。首先你要运行 gem install pubnub这是称为 PubNub 的实时组件,可让您直接向目标用户或网站和应用程序上的一组用户发送通知。这使您可以只针对那些在线并有兴趣从 Rails 服务器接收通知的人。您可以将其视为高效的服务器发送事件,不需要在服务器上进行数据库查找或其他资源密集型操作。

Ruby GEM 安装

gem install pubnub

需要 PubNub GEM
require 'pubnub'

初始化 PubNub 类
pubnub = Pubnub.new(
    :publish_key   => 'demo', # publish_key only required if publishing.
    :subscribe_key => 'demo', # required always
    :secret_key    => nil,    # optional - message signing
    :cipher_key    => nil,    # optional - AES 256 Crypto
    :ssl           => true    # optional - SSL 2048bit
)

从 Rails 3.0+ 向 Web 应用程序发送消息

现在从您的 Rails 应用程序中使用 pubnub类准备好了,您可以发送任何类型的 JSON 数据类型,包括字符串、数字、数组和字典/对象:
  • 一个“字符串”
  • 号码 123
  • 一个数组 [ 1, 2, 3 ]
  • 一个对象 { :a => "苹果"}

  • 以下代码将向您展示将消息从 Rails 应用程序直接传递到用户正在运行的浏览器或 Web 应用程序的过程。当您需要直接从服务器发送数据时,本质上就是将数据发送给您的用户。 pubnub.publish(...)函数会将您发送的消息序列化为 JSON,以便传输到您的移动和 Web 应用程序。
    ## Broadcast or Unicast to Browser App User(s)
    pubnub.publish(
        :channel  => "event_feed_channel",
        :message  => { :event => "update", :from => "Jay", :feed => "New Updates!" },
        :callback => lambda { |info| puts info }
    )
    

    此过程非常适合性能和安全考虑,并且从不需要数据库查询;使您免于对数据库服务器和其他资源密集型操作进行重击。您可以将此过程视为 SSE(服务器发送事件)在 Rails 应用程序中使用 PubNub GEM 时。

    使用 PubNub GEM,您实际上是将事件从服务器直接发送到用户的浏览器/应用程序。它消除了对客户端定期 AJAX 请求的需要。这是因为您仅在有新信息可用时才向用户发送数据。您也可以consider using more PubNub Real-time Network features like Presence and Storage/Playback访问主页以了解有关 Ruby 功能的更多详细信息。还有use the Developers Dev Console用于在集成到 Rails 代码期间需要时进行调试。

    设置浏览器以接收服务器发送的事件

    接下来,您需要通过运行 init 并传入
    <script src=http://cdn.pubnub.com/pubnub-3.4.2.min.js ></script>
    <script>(function(){
    
        // Class Setup
        var pubnub = PUBNUB.init({ subscribe_key : 'demo' });
    
        // Event Hook Setup
        pubnub.subscribe({
            channel : "event_feed_channel",
            message : function(m){ pubnub.events.fire( m.event, m ) }
        });
    
        // RECEIVE the "update" Server Broadcast Event in the Browser
        pubnub.events.bind( "update", function(message) {
            console.log( "update a <div> with received event: ", m );
        } );
    
    })();</script>
    

    Note you may be interested in Advanced Subscribe Connectivity Options and Events.



    注意 "update"事件与 :event => "update" 相同 中的消息值 ruby 代码。这意味着该事件将根据您提供的名称触发,您需要绑定(bind)该事件以触发代码以在您的 Web App 页面上执行。在此触发事件中,您将使用用户希望在其屏幕上实时看到的任何相关详细信息来更新用户界面。

    另请注意 :channel => "event_feed_channel"publish channel ,并且必须与 subscribe 相同JavaScript 客户端代码中的 channel 。

    如果你想阅读 Ruby GEM 的源代码,可以通过 GitHub PubNub Ruby-based APIs 获得。 .

    这些是开始使用 Ruby 3.0+ 应用程序并将事件直接从您的服务器发送到您的最终用户的基础知识。请注意,这也适用于在 iOS Web 浏览器或 Android 浏览器上运行的移动应用程序。此机制还支持旧版本的 IE。此外,您可以选择考虑将服务器从 Rails 服务器直接发送到 native iOS 应用程序和 native Android 应用程序的事件。如果您有任何问题,请在此论坛上向他们提问。

    关于ruby-on-rails - 如何在rails 3中实时推送内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15419667/

    相关文章:

    php - 即时网络通知

    python - 处理服务器端事件断开连接

    java - 使用 HTML5 服务器事件和 Java Servlet 时如何防止 net::ERR_INCOMPLETE_CHUNKED_ENCODING?

    go - 读取客户端上未缓冲的服务器发送事件

    ruby-on-rails - rails : Multi-submit buttons in one Form

    ruby-on-rails - 如何将 Rails DateTime 分辨率限制为微秒?

    javascript - jQuery map 实时数据更新

    IOS同步音乐流媒体

    ruby-on-rails - rails : acts_as_tree and acts_as_sane_tree

    ruby-on-rails - Rails image_tag 完整路径