Rails的事件监听器

时间:2015-08-26 19:26:11

标签: ruby-on-rails ajax ruby-on-rails-4

我想尝试制作一个简单的实时聊天Rails网络应用程序,但我想我需要某种让我们称之为"事件监听器"能够跟踪已发送的消息,以便接收者用户的提要更新新消息。另外,对于Typing...通知框。

我希望自己解释一下。

我想我可以用非常troglodyte的方式来实现这一点,如下所示:

main.js

while(true) {
    $.get('/user-you-are-talking-to/are-there-new-messages', function(data) {
        if (data['are_there_new_messages'] === true) {
            $('#conversation').append(data['new_message']);
        }
    });
}

conversation_controller.rb

# routed by /user-you-are-talking-to/are-there-new-messages'
def new_messages?
    unless @new_messages.blank?
        @json = []
        @json[:are_there_new_messages] = @new_messages.count > 0
        @json[:new_message]= @new_messages.shift
        render json: @json
    end
end

但除了我没有测试该代码的事实外,显然,对服务器的while循环和常量请求似乎是一个非常糟糕的主意。

我想知道Rails是否具有这样的内置功能,但据我所知它并不像我和Laravel这样的框架不同。如果没有内置工具,我该怎么办这个应用程序?

2 个答案:

答案 0 :(得分:1)

实时应用程序通常使用websockets完成。

https://github.com/eventmachine/eventmachine

https://github.com/igrigorik/em-websocket

或者,如果在托管服务上,您可以使用发布/订阅服务,例如Pusher或PubNub。

否则,您将进行轮询,这是您的示例中的内容。

答案 1 :(得分:1)

Rails 5将附带Action Cable

  

Action Cable将websockets与Rails应用程序的其余部分无缝集成。它允许以与Rails应用程序的其余部分相同的样式和形式在Ruby中编写实时功能,同时仍然具有高性能和可伸缩性。它是一个提供客户端JavaScript框架和服务器端Ruby框架的全栈产品。您可以访问使用ActiveRecord或您选择的ORM编写的完整域模型。

但是,当您等待它时,您可以使用许多现有的解决方案,其中一些解决方案已列出。

另一种选择是Faye(从未使用过,但听过好话)。