2015-10-20 5 views
6

мне нужно сделать запрос на удаленную службу после отрисовки страницыКак вызвать метод после рендера?

Мой контроллер:

after_filter :remote_action, only: :update 

def update 
    @res = MyService.do_action foo, bar 
    return render json: @res[:json], status: @res[:status] unless @res[:success] 
end 

def remote_action 
    # There is remote http request 
end 

Мне нужно вызвать метод remote_action после рендеринга страницы

+0

Не знаете, зачем вам это нужно? Можете ли вы дать больше информации о том, почему его нужно вызывать после, а не во время? Вы можете сделать api-вызов через js, который запускает это действие после того, как страница отобразится на стороне клиента. – penner

+0

Требуется некоторое время, чтобы сделать запрос на удаленном сервере, и мне нужно вызвать это действие в фоновом режиме, например: отправка твитов через twitter api –

ответ

9

after_filter запускается после того, как шаблон был преобразованный в html, но до, что html отправляется как ответ клиенту. Итак, если вы делаете что-то медленное, например, делая удаленный HTTP-запрос, это замедлит ваш ответ, так как ему нужно дождаться завершения этого удаленного запроса: другими словами, удаленный запрос заблокирует ваш ответ.

Чтобы избежать блокировки, можно раскошелиться от другого потока: взглянуть на

https://github.com/tra/spawnling

Используя это, вы бы просто изменить свой код

def remote_action 
    Spawnling.new do 
    # There is remote http request 
    end 
end 

Удаленный вызов все еще запускается до того, как ответ будет отправлен обратно, но поскольку он был разветвлен в новый поток, ответ не будет ждать возвращения удаленного запроса, это просто произойдет сразу.

Вы также можете посмотреть https://github.com/collectiveidea/delayed_job, который помещает задания в таблицу базы данных, где отдельный процесс вытащит их и выполнит их.

+0

Спасибо! Это сработало! –

+0

Отлично! Не стесняйтесь отметить мой ответ как правильный :) –

Смежные вопросы