Потоковый вывод из Prawn / Prawnto в Rails перед рендерингом - PullRequest
0 голосов
/ 23 марта 2011

Есть ли у кого-нибудь примеры запуска файлового потока перед процессом рендеринга / построения при использовании Prawn?

Ситуация такова, что у меня есть отчет из 350 или около того страниц, который занимает около 60 секунд для запуска на моей собственной рабочей станции, но при переводе его в рабочий режим (EC2) время запуска отчета увеличивается более чем на 300 секунд, и когда он заканчивает, не отправляет PDF в браузер.

Даже 60 секунд - это долгое время без обратной связи с пользователем, но 300 не работает, даже если вы ждете. То, что я хотел сделать, это начать загрузку файла до процесса рендеринга (я использую представление .pdf.prawn для этого с Prawnto), чтобы, по крайней мере, пользователь мог видеть, что что-то происходит во время обработки, но так далеко не смогли этого сделать. Все примеры и руководства, которые я нашел, начинают загрузку после окончания рендеринга и после долгого ожидания.

Если ничего не помогает, я посмотрю на планирование отчета, но в идеале пользователь сможет просмотреть отчет, затем вернуться и внести изменения и запустить его снова, что, очевидно, не позволит планирование.

Не очень много кода, который можно показать с помощью Prawnto, поскольку это всего лишь макет PDF в представлении, и вызывается через него в контроллере. Я попробовал send_file и переместил макет PDF в контроллер, чтобы запустить его без Prawnto, но все изменения, похоже, дают тот же результат - PDF отправляется в браузер после долгого ожидания.

На данный момент у меня нет идей, и я буду признателен за любые идеи!

 respond_to do |format|
  format.pdf {
    prawnto :prawn => {:page_layout => :portrait, :skip_page_creation => true}, :inline => false
    render :layout => false
  }

1 Ответ

2 голосов
/ 23 марта 2011

Если на создание PDF-файла у вас уходит более 60 секунд, вам следует рассмотреть возможность его загрузки в фоновый рабочий. Рекомендуется использовать Delayed :: Job или Resque.

Пусть рабочий создаст PDF и сохранит его на диске; бросить флаг (например, в базу данных или что-то еще), чтобы указать, что PDF готов для загрузки.

Это добавит некоторую дополнительную сложность вашему приложению, но пользовательский интерфейс значительно улучшится, и у вас нет проблемы «не удается загрузить PDF», которую вы описываете. Кроме того, если ваше приложение интенсивно используется, вы можете с лёгкостью выгружать рабочих, создающих PDF, на другой сервер.

...