потоковые просмотры в ruby on rails 3.1

#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 я вижу, что он передает заголовок ответа и макет, но не содержимое шаблона.