2011-08-09 50 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