0

チャット アプリケーションの実装方法を説明しているこの 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 %>

サーバーイベントのリッスンを処理する 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 ファイルをダウンロードして untar しただけです。システムに認識されているので問題ありません。

アプリケーションを試してみると、新しいメッセージでチャットが更新されません。それらを表示するには、ページを更新する必要があります。助けて?

4

1 に答える 1

3

ストリームにはデータを書き込まず、イベント タイプのみを書き込むようです。

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
于 2013-01-25T16:05:30.247 に答える