Techioz Blog

Rails 4 ライブストリームは Puma では機能しません

概要

Pumaサーバーを使用してRails ActiveController::Liveに小さなテストを実装しようとしています。 Rails s puma で Puma サーバーを起動し、curl localhost:3000/messages/events を使用してテストを行いました。ただし、データが一斉に返されるまでに長い待ち時間があり、これは WEBrick を使用した場合と同じでした。では、なぜ Puma サーバーは結果をライブ ストリーミングしないのでしょうか?

class MessagesController < ApplicationController
  include ActionController::Live

  def index
    @messages = Message.all
  end

  def create
    @message = Message.create!(params[:message].permit(:content, :name))
  end

  def events
    3.times do |n|
      response.stream.write "#{n}...\n\n"
      sleep 2
    end
  ensure
    response.stream.close
  end
end

解決策

応答ヘッダーを設定する必要があります

def events
   response.headers['Content-Type'] = 'text/event-stream'
   3.times do |n|
     response.stream.write "#{n}...\n\n"
     sleep 2
   end
ensure
   response.stream.close
end