class PostsController < ApplicationController # ... def stream response.headers.delete('Content-Length') response.headers['Cache-Control'] = 'no-cache' response.headers['Content-Type'] = 'text/event-stream' self.response_body = Enumerator.new do |y| loop do if (Time.current.sec % 5).zero? y << "event: counter\n" y << "data: 5 seconds passed\n\n" end sleep 1 end end end # The new approach # include ActionController::Live def stream response.headers['Content-Type'] = 'text/event-stream' begin loop do if (Time.current.sec % 5).zero? response.stream.write("event: counter\n") response.stream.write("data: 5 seconds passed\n\n") end sleep 1 end rescue IOError # Catch when the client disconnects ensure response.stream.close end end # ... end