2014-11-21 47 views
1

我有一個應用程序,它使用SuckerPunch gem和Carrierwave Backgrounder在rails應用程序的後臺上載和處理圖像。因此,當用戶創建資產模型的實例時,在圖像正在處理時,資產模型中的屬性attachment_processing?設置爲true。我指出這給用戶使用該視圖模板Rails使用後臺進程應用回撥觸發事件

-if instance.send(base_name) 
    .form-row 
    - if instance.send(base_name).attachment_processing? 
     .image_processing 
     %span Processing Asset #{proccessing_asset_name(instance.send(base_name))} 
     = image_tag("ajax-loader.gif") 
    - else  
     = nice_asset(instance.send(base_name),options[:thumb]) 

當資產已處理完被設置爲false和圖像顯示後,頁面刷新的屬性。查看服務器日誌,它會在處理完成後自動啓動。

Started GET "/assets/ajax-loader.gif" for 127.0.0.1 at 2014-11-21 16:10:38 +0000 
    (0.2ms) BEGIN 
    SQL (0.4ms) UPDATE `assets` SET `attachment_processing` = 0, `updated_at` = '2014-11-21 16:11:14' WHERE `assets`.`id` = 6362 
    (1.9ms) COMMIT 

有沒有一種方法,通過ajax或其他方法,使用它來自動顯示完成的圖像? 我只是尋找更友好的方法,而不是要求用戶刷新頁面或類似的東西?

非常感謝

+0

耶,我建議你去websocket! socket.io可以在redis pubsub的幫助下解決這個問題。 – Rubyrider 2014-11-21 16:33:38

回答

0

要做到這一點,最簡單的方法是將頁面設置爲auto refresh每隔幾秒鐘,這將會使頁面完全刷新是否有更新與否:

<head> 
    <meta http-equiv="refresh" content="30"> 
</head> 

如果你想要一個更一點技巧,你可以在需要的時候要輪詢使用ajax服務器,並刷新使用JavaScript的頁面(或頁面的相關部分):

<script> 
    $(document).ready(function(){ 
    setInterval(updateSeats,30000); 
}); 
    function updateSeats(){ 
    $.ajax({ 
    url: "/flights/<%= @flight.id %>/seats", 
    type: "GET", 
    }).done(function(data){ 
    $("#seats").html(data); 
    }); 
    } 
</script> 

根據手頭的使用情況,您也可以考慮實施更復雜的推式方案,如long polling

+0

他似乎在尋求事件驅動的解決方案! – Rubyrider 2014-11-21 16:40:59

+1

@Rubyrider - 他希望在服務器和客戶端之間建立一個事件驅動的解決方案。由於Web服務器無法向客戶端發送推送消息,因此需要實施輪詢解決方案以模擬它...它可能與定期刷新頁面一樣粗糙,或者像長輪詢實施一樣精細 – 2014-11-21 16:46:36

+0

yah實現將很複雜對於這個用例。 – Rubyrider 2014-11-21 16:48:50

相關問題