Skip to main content

streaming_partials_live

⚡ Streaming Partials with ActionController::Live

Leverage ActionController::Live to stream large partials chunk by chunk, reducing memory footprint and time to first byte. This is vital when rendering thousands of records or large data transforms.

# app/controllers/reports_controller.rb
class ReportsController < ApplicationController
include ActionController::Live

def index
response.headers['Content-Type'] = 'text/html; charset=utf-8'
self.response_body = stream_renderer
end

private

def stream_renderer
Enumerator.new do |yielder|
yielder << render_to_string(partial: 'reports/header')
Report.find_each(batch_size: 1000) do |report|
yielder << render_to_string(partial: 'reports/item', locals: { report: report })
end
yielder << render_to_string(partial: 'reports/footer')
end
end
end