Возможно ли, чтобы Rails закрывал соединение клиент / браузер, но продолжал работать в фоновом режиме? - PullRequest
1 голос
/ 04 января 2011

У меня есть относительно длинная задача, которая должна быть запущена в действии контроллера, но ее не нужно завершать до отображения представления.Как я могу закрыть соединение с браузером, но продолжить выполнение задачи?Это кажется обычной практикой, но я могу найти что-нибудь на SO или Google, как это сделать.

TIA!

РЕДАКТИРОВАТЬ:

Хотел бы сделать Rails эквивалентным следующему PHP-коду:

$contentLength = ob_get_length();

// these headers tell the browser to close the connection   
// once all content has been transmitted  
header("Content-Length: $contentLength");  
header('Connection: close'); 

// flush all output
ob_end_flush();
ob_flush();
flush();

// Finish the task.

Ответы [ 4 ]

1 голос
/ 17 июня 2011

В рельсах 3 до

class MyController < ApplicationController
   def index
     self.response_body = lambda do |response,output|
        5.times do |i| 
           response.write i
           sleep(2)
        end

     end
   end   
end

Однако вам нужно исправить ошибку рельсов 3

они выполняют 2 раза одну и ту же лямбду

включает один файл в config / initializers / rack_patch.rb

class Rack::Response
  def close
    @body.close if @body.respond_to?(:close)
  end
end
0 голосов
/ 04 января 2011

Вы также можете использовать resque gem

0 голосов
/ 04 января 2011

Два решения были указаны до сих пор.Те и другие перечислены в наборе инструментов Ruby здесь: http://ruby -toolbox.com / Categories / queueing.html

0 голосов
/ 04 января 2011

Для этого используйте гем delayed_job . Позволяет указать фоновые задачи для запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...