为AJAX请求设计用户身份验证

时间:2011-08-09 23:33:15

标签: ruby-on-rails ruby devise

在需要用户(通过设计)的AJAX调用中处理重定向的最佳方法是什么?我想做类似的事情:

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

但是,我不确定在过滤(验证用户)处理'js'请求格式之前如何设计。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

Devise有特殊选择:http_authenticatable_on_xhr 您可能会发现this devise issue相关。

另外,我真的建议不要在XHR请求中使用重定向。一旦你尝试使用firefox,你会发现自己陷入痛苦的世界。在Gecko 7.0之前,firefox在执行XHR重定向时不会保存原始请求中的标题。

根据developer.mozilla.org XMLHttpRequest page:

  

来自Gecko 7.0 setRequestHeader()设置的标头在跟随重定向时随请求一起发送。以前这些标题不会被发送。

答案 1 :(得分: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中,则可以在用户经过适当身份验证后完成请求。