我正在关注这个 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/