#ruby-on-rails #ruby-on-rails-3.1 #http-streaming
#ruby-on-rails #ruby-on-rails-3.1 #http-потоковая передача
Вопрос:
Я новичок в rails, и Ruby, если на то пошло. Я создал приложение Rails на основе ruby 1.9.2 и rails 3.1
Я столкнулся с проблемой, вероятно, с моим пониманием реализации потоковой передачи в rails. Мне кажется, что перед тем, как rails отобразит содержимое шаблона, он должен завершить процесс его оценки.
допустим, например, что у меня есть cgi-скрипт, подобный следующему
#!/bin/sh
cat <<END
Content-Type: text/html
END
for i in {1..10}
do
echo $i
sleep 1
done
при этом числа будут отображаться в браузере последовательно от 1 до 10 по мере их отображения скриптом, а не все сразу. Это поведение, которое я хотел бы имитировать в представлении rails.
допустим, у меня есть следующее в представлении.
<h1> hi </h1>
<%
sleep 5
%>
<h2> bye </h2>
он будет ждать, пока не завершится режим ожидания 5, прежде чем отображать что-либо.
используя curl -i для просмотра ответа с веб-сервера, я немедленно получаю заголовок ответа, как и ожидалось, с Transfer-Encoding: chunked, как и ожидалось. однако он не отображает содержимое тела до завершения режима ожидания.
что мне нужно сделать, чтобы он отображал содержимое тела таким же образом, как тот простой cgi-скрипт, который я вставил выше? В частности, сначала <h1> hi </h1>
затем через 5 секунд <h2> bye </h2>
?
Ответ №1:
Взгляните на документацию для ActionController::Streaming. А именно:
Потоковую передачу можно легко добавить в данный шаблон, все, что вам нужно сделать, это передать
:stream
опцию.
class PostsController def index @posts = Post.scope render :stream => true end end
Вы, конечно, захотите прочитать остальные документы для получения подробной информации.
Комментарии:
1. правильно, и это то, что у меня есть в контроллере, который у него есть
format.html { render :stream => true }
, и с помощью curl я вижу, что он передает заголовок ответа и макет, но не содержимое шаблона.