2012-08-28 93 views
1

我需要更新我的index.html.erb文件(用於產品),但不用重新加載整個頁面。 例如,我有一個名爲「Sold」的列,其值爲「YES」或「NO」。我有一個後臺更新任務,更新了這些值,但我希望我的索引文件能夠更新,顯示用戶可以看到哪些產品銷售與否。我不知道如何從rake任務中調用這樣的更改。請幫忙嗎?我看到的大多數ajax和rails 3「教程」主要涉及用戶到服務器的交互,而不是服務器到用戶的交互。Rails 3和Ajax

+0

這是因爲服務器無法向瀏覽器發起請求(或多或少)。您可以進行短期或長期投票。 –

回答

1

many methods用於獲取服務器的更新。

  • 輪詢(setTimeout的,使每隔一段時間一個Ajax請求)
  • 長輪詢(什麼Facebook的使用)
  • 彗星(阻塞請求,不讓它完成,同時定期注入的JavaScript,類似長輪詢)
  • 的WebSockets(HTML5的東西)
  • 的Flash/Java小程序等

通常一個簡單的投票,每一個那麼多,塞康ds將完成這項工作。 - >(asciicast

Here是不同的方法的比較。

+0

對於投票中的那個railscasts鏈接+1。 –

0

您可能會在您的產品索引頁上添加JavaScript代碼,以便定期ping您的服務器以獲取產品的狀態(每n秒)。如果你的網頁上有很多產品,這可能是一個昂貴的通話。所以我對你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> 

這樣的事情然後平路由添加到您的產品控制器,它基本上與包含要在您的視圖更新的產品的狀態和ID的JSON對象響應。因此,當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。