2012-08-28 2 views
1

제품 용 index.html.erb 파일을 업데이트해야하지만 전체 페이지를 다시로드하지 않아도됩니다. 예를 들어 값이 "YES"또는 "NO"인 "Sold"라는 열이 있습니다. 그리고 그 값을 업데이트 한 백그라운드 레이크 작업이 있지만 색인 파일을 업데이트하여 사용자에게 판매되는 제품이 어떤 것인지를 보여줍니다. 레이크 작업에서 이러한 변경을 호출하는 방법을 알지 못합니다. 어떤 도움을 주시겠습니까? 대부분의 아약스와 레일 3의 "튜토리얼"은 사용자와 서버 간의 상호 작용을 다루지 만 사용자와 서버는 다루지 않습니다.레일즈 3 및 Ajax

+0

서버가 브라우저로 요청을 시작할 수 없기 때문입니다. 단기 또는 장기 투표를 할 수 있습니다. –

답변

1

서버 업데이트를 받기 위해 many methods이 있습니다.

  • 폴링 (페이스 북을 사용하는 것)
  • 롱 폴링
  • 혜성 (요청을 차단 (의 setTimeout은 아약스 요청 모든 너무 자주를 만들기 위해), 롱 폴링과 유사한, 정기적으로 자바 스크립트를 주입하면서 마무리를 허용하지 않습니다)
  • WebSocket을 (HTML5 물건)
  • 플래시/자바 애플릿 등

일반적으로 간단한 폴링 - 모든 그리 많은 SECON ds가 그 일을 할 것입니다. -> (asciicast)

Here 다른 방법의 비교입니다.

+0

+1 해당 폴링에 대한 railscasts 링크. –

0

제품 인덱스 페이지에 자바 스크립트 코드를 추가하여 서버를 핑 (Ping)하여 정기적으로 (n 초마다) 제품 상태를 확인할 수 있습니다. 귀하의 페이지에 많은 제품이있는 경우 이것은 비싼 전화 일 수 있습니다. 그래서 그런 기본적으로 당신이보기에 업데이트 할 제품의 상태 및 ID를 포함하는 JSON 객체로 응답 제품 컨트롤러로 핑 경로를 추가하여 index.html.erb

<script type="text/javascript"> 
    $('document').ready(function() { 
    $.ajax({ 
     method: 'get', 
     url : 'products/ping', 
     dataType : 'json', 
     success: function (json) { 
     // iterate through json objects and update their respective sold status 
     // on page. 
     } 
    }); 
</script> 

에 이런 일이있을 것이다. 따라서 Ajax 요청이 완료되고 JSON 객체를 얻으면 제품을 반복하고 ID를 기반으로 해당 제품의 상태를 업데이트합니다. 그 코드가 테스트되지 않은 상태입니다

# app/controllers/products_controller.rb 
def ping 
    respond_to do |format| 
    products_sold_statuses = {} 
    format.json do 
     Products.all.each do |product| 
     # add product sold status and probably id to products_sold_statuses 
     end 
     render :json => product_sold_statuses, :layout => false 
    end 
    end 
end 

그래서 그냥 솔루션을 구축에 기본으로 사용 : 그래서 제품 컨트롤러의 액션은 다음과 같이 보일 것입니다. 또한 JQuery를 사용한다고 가정합니다.