2011-08-09 53 views
3

在需要用戶(通過設計)的AJAX調用中處理重定向的最佳方式是什麼?我想這樣做:爲AJAX請求設計驗證用戶

$('#love').click(function() { 
    $.get('/item/#{item.id}', function(data) { 
    if (data.redirect) { window.location.replace(data.redirect); return; } 
    }); 
}); 

但是,我不知道如何讓過濾器之前(驗證用戶)制定處理「JS」請求格式。有任何想法嗎?

+1

我只是打開一個隱藏的iframe中的其他頁面來執行身份驗證和其他服務器端的工作,頁面可以通過它的響應調用父級的js函數,您可以根據響應進行重定向。 – Ali

回答

2

你可以做這樣的事情在你的ApplicationController文件通過AJAX來重定向:

# allows redirecting for AJAX calls as well as normal calls 
    def redirect_to(options = {}, response_status = {}) 
    if request.xhr? 
     render(:update) {|page| page.redirect_to(options)} 
    else 
     super(options, response_status) 
    end 
    end 

所以基本上,如果請求是通過AJAX和控制器動作(或的before_filter)製成說重定向到登錄頁面,這將重定向該AJAX呼叫的頁面。

如果您將請求數據存儲在cookie中,則可能能夠在用戶正確驗證身份後完成請求。

3

設計有以下特殊選項:http_authenticatable_on_xhr 您可能會發現this devise issue有關。

此外,我真的反對使用XHR請求重定向。一旦你嘗試使用Firefox,你會發現自己處於一個痛苦的世界。在Gecko 7.0之前,firefox在遵循XHR重定向時不會從原始請求中保存標題。

根據developer.mozilla.org XMLHttpRequest page:

從壁虎()由setRequestHeader設置7.0標頭與所述請求以下重定向時發送。以前這些標題不會被髮送。

+1

稍微詳細一點。當我偶然發現這一點時,我得到了正常的重定向,而不是通過xhr加載部分。花了我一些寶貴的時間,才意識到這不是我的代碼行爲不當。 – Slotos