Я испытываю то, что не могу объяснить с помощью Rails 2.3.2. Я создал новое приложение с одним контроллером и одним действием, чтобы попытаться сузить это. Весь мой контроллер выглядит следующим образом.
class LinesController < ApplicationController
def show
respond_to do |format|
format.html { render :text => proc {|response, output|
10.times do |i|
output.write("This is line #{i}\n")
output.flush
end
}
}
end
end
end
Когда я запускаю это под Rails 2.2.2, я вижу следующий ответ.
$ curl http://localhost:3002/lines
This is line 0
This is line 1
This is line 2
This is line 3
This is line 4
This is line 5
This is line 6
This is line 7
This is line 8
This is line 9
Однако, когда я запускаю это под Rails 2.3.2, я получаю это вместо этого.
$ curl http://localhost:3002/lines
curl: (18) transfer closed with outstanding read data remaining
Если я нажму на это в браузере, то увижу только первую строку.
This is line 0
Обратите внимание, что мой пример кода прямо из документации Rails для render , за исключением того, что я уменьшил количество строк с 10 миллионов до 10.
Я подозреваю, что ответ лежит где-то в методе flush (), но в настоящее время я застрял, пытаясь найти объяснение в исходном коде.