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

时间:2013-03-14 20:36:51

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

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

首先考虑一些事项: 我有一个带有一些社交功能的Rails 3应用程序。我想要实现的功能之一是在创建新活动时通知我的用户。 我的第一种方法是实现SSE和一个控制器,在最后一次加载的活动之后在数据库中搜索新的注册表。

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

我的第二种方法是创建一个指向控制器的路由,一个观察者在创建新活动时捕获,稍后将创建的当前活动传递给控制器​​,最后通过SSE将活动部分渲染。

这就是我的问题..如何将观察者与控制器连接起来并将其传递给当前要渲染的活动? 在那里,我可以使用其他控制器类型,如金属控制器,甚至是抽象控制器吗?

在这一点上,我意识到这可能是另一种做这项工作的方法。 如果我能找到一种方法来做到这一点,而不必在另一种语言或框架中开发它,那将是非常好的。我认为应该有一个可以更容易实时应用程序的宝石.. 你怎么看??我是正确的方式或我应该做什么来实现这一目标? 非常感谢!!

2 个答案:

答案 0 :(得分:5)

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

为了安全可靠地将具有某些社交功能的实时更新推送到您的网站或网络应用程序上,正如您所说,有许多可用选项以及许多细微​​差别。 有一个宝石!我将帮助您开始为您的Rails 3.0+应用程序和网站提供一个简单的入门指南。首先,您需要运行gem install pubnub这个名为PubNub的实时组件,它允许您直接向目标用户或您网站和应用上的一组用户发送通知。这允许您仅定位那些在线并且有兴趣从您的Rails服务器接收通知的人。您可以将此视为高效的服务器发送事件,不需要在服务器上进行DB Lookup或其他资源密集型操作。

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 App

现在从准备好pubnub类的Rails应用程序中,您可以发送任何类型的JSON数据类型,包括字符串,数字,数组和字典/对象:

  • a“String”
  • a Number 123
  • 数组[1,2,3]
  • 一个对象{:a => “apple”}

以下代码将向您展示将Rails应用程序中的消息直接传递给用户正在运行的浏览器或Web应用程序的过程。当您需要直接从服务器进行时,基本上将数据发送给您的用户。 pubnub.publish(...)功能会将您发送的邮件序列化为JSON,以便传输到您的移动和网络应用。

## 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 }
)

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

使用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>
  

注意您可能对Advanced Subscribe Connectivity Options and Events感兴趣。

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

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

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

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

答案 1 :(得分:0)

我已经构建了一个realtime rails gem和一个示例实时服务器(node.js),可以轻松实现实时消息传输,而无需付费的第三方,如Pusher或PubNub。它适用于Rails 3 +。