Программа урока
- Streaming шаблонов в Rails
- Streaming файлов в Rails
- Streaming vs Live в Rails
class BooksController < ApplicationController
def index
@books = Book.all
# Включение стриминга шаблонов
# https://api.rubyonrails.org/classes/ActionController/Streaming.html
render stream: true
end
end
# при запросе с помощью Curl данные будут отдаваться постепенно
class HelloController < ActionController::Base
include ActionController::Live
def stream
response.headers['Content-Type'] = 'text/event-stream'
response.headers["Last-Modified"] = Time.current.httpdate
100.times {
response.stream.write "hello world\n"
sleep 1
}
ensure
response.stream.close
end
end
# https://api.rubyonrails.org/v5.1.7/classes/ActionController/DataStreaming.html
class BooksController < ActionController::Base
include ActionController::Live
def send_file
# Используется для отправки готового файла
send_file(Rails.root.join('public', '404.html'), filename: 'hello.txt')
end
# https://api.rubyonrails.org/v5.1.7/classes/ActionController/DataStreaming.html
def send_data
# Отправляется стриминговый файл, которого изначально нет
data = 'Hello'
send_data(data, filename: 'hello.txt')
end
end
Самостоятельная работа
Создайте Rails-проект, если его еще нет. В этом задании добавим вывод логов development.log по адресу /logs
Создайте контроллер LogsController с методом index()
Добавьте в него потоковый вывод. Обычный вывод содержимого файла выглядит так:
class LogsController < ApplicationController
def index
log_file = Rails.root.join("log", "development.log")
@log_contents = File.read(log_file)
render plain: @log_contents
end
end
Пример результата
class LogsController < ApplicationController
include ActionController::Live
def index
response.headers['Content-Type'] = 'text/event-stream'
file = File.open(Rails.root.join("log", "development.log"), "r")
file.seek(0, IO::SEEK_END) # сразу в конец, чтобы "слушать" новые строки
loop do
line = file.gets
if line
response.stream.write "#{line}\n\n"
end
end
rescue IOError
# клиент отключился
ensure
file.close
response.stream.close
end
end
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.