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

в сообщениях/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 %>

У меня есть файл .js в папке assets/javascript, который отвечает за прослушивание событий сервера.

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-сервер на отдельном терминале, подобном этому

$: redis-server

Я не устанавливал Redis с помощью brew, просто скачал tar-файл и разархивировал его. Он распознается системой, так что все должно быть в порядке.

Когда я пробую приложение, оно не обновляет чаты новыми сообщениями. Мне нужно обновить страницу, чтобы они отображались. Любая помощь?


person Trt Trt    schedule 25.01.2013    source источник


Ответы (1)


Кажется, вы не записываете никаких данных в поток, только тип события.

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
person Thomas Klemm    schedule 25.01.2013