2012-10-19 4 views
0

나는 많은 시간이 소요되는 작업이 있습니다. 나는 프로세스 중에 업데이트를 제공하여 사용자가 연결이 끊어 졌는지 여부를 혼동하지 않도록하고 싶습니다. 다음과 같이 할 수 있습니까?긴 레일 컨트롤러 동작 중에 업데이트 제공

class HeavyLiftingController < ApplicationController 
    def data_mine 
    render_update :js=>"alert('Just starting!')" 
    # do some complicated find etc. 
    render_update :js=>"alert('Found the records!')" 
    # do some processing ... 
    render_update :js=>"alert('Done processig')" 
    # send @results to view 
    end 
end 

답변

0

이렇게 요청을 처리하는 것은 불가능합니다. 각 요청마다 단 하나의 답을 얻을 수 있습니다.

조치가 오래 걸리는 경우 비동기 적으로 수행해야합니다. 프로세스 중에 사용자 전자 메일을 보내 진행 상황을 알릴 수 있습니다.

난 당신이 DelayedJob 보석에 살펴 봐야하는 것이 좋습니다 : http://rubygems.org/gems/delayed_job

그것은 당신을 위해 assync 물건을 다루는 가장 어려운 부분 처리 할

(등등, 직렬화/당신의 객체 스토리지를 역 직렬화를 ...) .

희망은 당신을 돕는다!

2

아니요, 컨트롤러 동작 내에서만 하나의 렌더를 실행할 수 있습니다. 컨트롤러는 컨트롤러가 종료 될 때까지 아무것도하지 않습니다. data_mine이 끝나면 오류가 발생하는 3 개의 렌더링이있게됩니다.

UPDATE :

당신거야 가능성이 주기적으로 다음 브라우저에서 자바 스크립트 (JQuery와) 타이머를 설정하여 장기 실행 작업의 현재 상태를 확인하기 위해 서버에 AJAX 요청을 보내야합니다.

예를 들어 장기 실행 작업은 진행되는 로그를 기록 할 수 있으며 정기적 인 AJAX 요청은 해당 로그를 읽고 일종의 상태 표시를 만들고이를 표시하기 위해 브라우저에 반환합니다.

+0

그러나 긴 작업을 수행하고 사용자에게 업데이트를 실행하는 방법이 있어야합니까? 작은 행동으로 나누세요? 그러나 액션이 서버 측에서 서로 호출 할 수 있습니까? – highBandWidth

+0

업데이트 됨 – RadBrad