ruby - Rails 4 直播

标签 ruby ruby-on-rails-3 redis railscasts ruby-on-rails-4

我正在关注这个 railscast,它解释了如何实现聊天应用程序。我一步一步地跟进了一切,直到我开始使用 redis 作为它的发布/订阅版本以使其更快时,它似乎一直在工作,但我的应用程序现在没有更新聊天记录。每次收到新消息时,我都必须刷新页面!

这是我的代码:

class MessagesController < ApplicationController
    include ActionController::Live

  def index
    @messages = Message.all
  end

  def create
    response.headers["Content-Type"] = "text/javascript"
    @message = Message.create!(params[:message].permit(:content, :name))
    $redis.publish('messages.create',@message.to_json)
  end

  def events   
    response.headers["Content-Type"] = "text/event-stream"
    redis=Redis.new
    redis.psubscribe('messages.create') do |on|
      on.pmessage do |pattern, event, data|
       response.stream.write("event: #{event}\n")
      end
    end
    rescue IOError
      logger.info "Stream closed"
    ensure
      redis.quit
      response.stream.close  
    end
end

在 messages/index.html.erb 中

<h1>Chat</h1>

<ul id="chat">
  <%= render @messages %>
</ul>

<%= form_for Message.new, remote: true do |f| %>
  <%= f.text_field :name, placeholder: "Name" %>
  <%= f.text_field :content %>
  <%= f.submit "Send" %>
<% end %>

我在 assets/javascript 文件夹中有一个 .js 文件,它负责监听服务器事件。

var evnt = new EventSource('/messages/events');

evnt.addEventListener('messages.create', function(e){
  var message;
  message = $.parseJSON(e.data).message;
  return $('#chat').append($('<li>').text("" + message.name + ": " + message.content));
});

我像这样在一个单独的终端上启动 redis-server

$: redis-server

我没有使用 brew 安装 redis,只是下载了一个 tar 文件并解压缩了它。系统能识别,应该没问题。

当我试用该应用程序时,它不会使用新消息更新聊天记录。我需要刷新页面才能显示它们。有帮助吗?

最佳答案

似乎您没有向流中写入任何数据,只有事件类型。

redis.psubscribe('messages.*') do |on|
  on.pmessage do |pattern, event, data|
    response.stream.write("event: #{event}\n")
    response.stream.write("data: #{data}\n\n") # You are missing this line.
  end
end

关于ruby - Rails 4 直播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14525464/

相关文章:

ruby-on-rails-3 - 仅当不为空时才验证电子邮件格式 Rails 3

ruby-on-rails - 保留搜索表单数据 Ruby On Rails

ruby-on-rails - 如何在两个模型之间建立两个 has_many/belongs_to 关系?

ruby-on-rails - Rails 欧洲格式 CEST/CET 的统一 DateTime 时区

database - Redis 高效创建键

python - redis:设置是否存在 - 通过 python

redis - 关于 redis 工作的冲突 : Is redis single threaded or multithreaded?

sql - 使用 Chef 运行所有 sql 文件

ruby - 数组上的#concat 和 += 有什么区别?

Ruby:Net::HTTP 空闲超时?