Я слежу за этим 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-файл и разархивировал его. Он распознается системой, так что все должно быть в порядке.
Когда я пробую приложение, оно не обновляет чаты новыми сообщениями. Мне нужно обновить страницу, чтобы они отображались. Любая помощь?