【问题标题】:Event listener for RailsRails 的事件监听器
【发布时间】:2015-08-26 19:26:11
【问题描述】:

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

我希望我自己解释一下。

我想我可以用一种非常像穴居人的方式来做到这一点,如下所示:

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。如果没有内置工具,我该怎么做这个应用程序?

【问题讨论】:

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


    【解决方案1】:

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

    https://github.com/eventmachine/eventmachine

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

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

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

    【讨论】:

    • 我不熟悉这些,你能给我看一个库和 websocket 服务器如何工作的简单例子吗?关于后者……该服务器是否应该替换我用于 Rails 应用程序的服务器?例如,当我只是为了好玩而制作应用程序时,我会使用集成的 Web 服务器 webrick。或者这与它无关?我对这些概念有点困惑。
    • @dabadaba:我想知道,自述文件中的示例还不够清楚吗?是的,为了处理 websockets,人们通常使用一个单独的服务器,更能做到这一点。当然不是 webrick。
    • 不,我不明白任何代码中发生了什么。
    • @dabadaba:是的,事件 I/O 是不平凡的东西 :)
    • 我在 java 中见过它,但很久以前,我不能很容易地看到如何将它集成到 Rails 应用程序中......
    【解决方案2】:

    Rails 5 将附带 Action Cable:

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

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

    另一个选项是Faye(从未使用过,但听说不错)。

    【讨论】:

    • 这是我所说的那种内置功能 ;) 不过需要等待。谢谢(你的)信息。在发布这篇文章之前,我一直在寻找一个 Rails 聊天教程,并找到了一个使用 Faye 的教程。一定会解决的。
    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 2023-03-14
    • 2011-10-20
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多