2010-07-07 3 views
1

내보기에서 간단한 진행률 표시 줄/진행 상태를 트리거하려는 컨트롤러에서 작업을 수행하는 데 시간이 있습니다. 내 컨트롤러에서컨트롤러에서 동적으로보기 변경 - 레일 스레딩을 사용하는 진행 막대

가 나는 이중 오류 렌더링 발생하기 때문에 나는 거기에 렌더링 넣을 수 없습니다

threads = [] 
total.times do |x| 
    Thread.new { 
     the_time_taking_task(x) 
     #Something here to trigger the progressbar in the view 
    } 
end 

threads.each { |aThread| aThread.join } 
render :action => 'some_action'  

같은 것을 가지고있다. 는 내가 렌더링 저기 돌아 퍼팅 시도하고 나는 내 컨트롤러보고 얘기 할 수있는 유일한 방법이 될 것 같다 나는 렌더링 노력하고 있어요 'return can't jump across threads'오류

얻었다. 내 접근 방식이 잘못 되었나요?

는 전화

<div style="width: <%= (percent_val)%>px; "> 

하시기 바랍니다 조언을 통해 진행 막대 폭을 적용 뷰에서이 같은 간단한 일을 할 것인가.

+0

장기 실행 작업은 백그라운드 프로세스 (비동기 및 비 차단)로 실행해야합니다. @shingara는 delayed_job 또는 그와 비슷한 것을 사용한다고 말했습니다. delayed_job은 구현하기가 훨씬 쉽다는 것을 알았습니다. delayed_job에서 railscasts를 확인하십시오. –

답변

6

네, 잘못된 접근입니다.

웹은 상태 비 저장이므로 다른 요청을 통해보기를 렌더링하고 가져 오는 프로세스를 차단할 수 없습니다.

좋은 방법은 다음과 같습니다

1) 대신 스레드의 태스킹 큐를 생성합니다. rabbitMQ 또는 beanstalkD와 같은 delayed_job, resque 또는 queue 시스템을 사용할 수 있습니다.

2) 컨트롤러를 추가하여 대기열의 프로세스가 끝나고 진행 상황을 확인하십시오. 안으로, 당신은 큐 ID를 넣고 종료 여부를 확인하고 진행률을 반환합니다.

가장 쉬운 방법은 Ajax에서하는 것입니다.

2

예, 접근 방법이 잘못되었습니다.

신간이 이것을 잘 설명합니다.

약간 더 구체적인 해결책을 제안합니다.

  1. 오프로드 백그라운드 작업 서버에 스레드 :

    원하는 효과를 얻으려면, 당신은 기본적으로 다음과 같은 단계가 필요합니다. Check resque 또는 delayed_job을 확인하십시오.

  2. 백그라운드 작업으로 인해 데이터베이스 또는 일부 영구 매체에 진행 상태를 기록하십시오. 레일에서
  3. 는 (JSON 또는 XML 등) 현재 진행보기에
  4. 를 반환하는 조치를 쓰기도 따라 3 단계
  5. 업데이트에 작성된 작업을 호출하는 정기적 인 아약스 요청을 작성합니다.

끝났습니다! : D