2013-08-27 78 views
0

我正在輪詢在JavaScript中成功/失敗的長時間運行過程。如果進程失敗,我需要它導航到特定頁面並顯示flash['alert']。我使用window.location.href導航到新頁面,但我無法弄清楚如何從js創建flash['alert']。作爲一個完整的臨時攻擊,我將一個錯誤消息作爲URL參數傳遞。然後在我的控制器new操作中,如果存在錯誤,我檢查參數並創建flash['alert']。我不喜歡這個解決方案,我假設有一個更乾淨的方法來做到這一點。從javascript創建flash消息/ jquery

function checkReportStatus() { 
    var report_id = $(".report").data("report-id"); 
    $.get('/reports/' + report_id + '/check_report_status', function(report_status) { 
     if (report_status === 'completed') { 
     location.reload(); 
     } 
     else if (report_status === 'error' || report_status === 'failed') { 
     window.location.href = "new?error=ERROR_MESSAGE"; 
     } 
     else { 
     console.log("Report generation in progress..."); 
     setTimeout(checkReportStatus, 3000); 
     } 
    }); 
} 
+1

您是否需要在JS中處理所有上述問題?爲什麼你不能輪詢一個Controller動作,它可以決定用消息渲染一個新頁面。 – Ari

+0

'check_report_status'是我正在輪詢的控制器操作。它返回'report_status'。我試圖在動作中添加一個'redirect_to',但它似乎不起作用。也許是因爲它是一個GET請求?此外,這是一個delayed_job後臺任務,所以我認爲控制器操作正在從worker中調用,可能無法重定向? – mnort9

回答

1

我解決了這個問題,將check_report_status代碼移動到控制器動作,並使用render而不是redirect_to

def check_report_status 
    @report = Report.find(params[:id]) 
    flash[:error] = "Report error" 
    render :js => "window.location = 'PATH'" 
    end 
1

$('element').effect('highlight', {color:'#XXXXXX'},1500);產生一個像樣的閃爍效果,因爲你提到在你的代碼中使用JQ的。