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

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

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

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

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

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

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

最佳答案
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应用程序

现在,从您的Rails应用程序准备好pubnub类,您可以发送任何类型的JSON数据类型,包括String,Number,Array和Dictionary / Object:

>一个“字符串”
>一个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 }
)

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

使用PubNub GEM,您实际上是将服务器中的事件直接发送到用户的浏览器/应用程序.它消除了客户端定期AJAX请求的需要.这是因为您只在新信息可用时向您的用户发送数据.您也可以访问主页以获取有关Ruby功能的更多详细信息.还有use the Developers Dev Console用于在集成到Rails代码期间进行调试.

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

接下来,您需要设置您的应用程序以通过运行init并传入来接收Server-Sent Events

<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 07002.

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

另请注意:channel => “event_feed_channel”是发布通道,它必须与JavaScript客户端代码中的订阅通道相同.

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

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

转载注明原文:ruby-on-rails – 如何在rails 3中实时推送内容 - 代码日志