2013-08-27 47 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的。