Ruby on rails 3 ajax中句柄注销重定向的设计
我有一个带有Rails/Desive服务器的主干.js客户端 我想用重定向实现注销过程 这是我的客户端代码Ruby on rails 3 ajax中句柄注销重定向的设计,ruby-on-rails-3,jquery,devise,Ruby On Rails 3,Jquery,Devise,我有一个带有Rails/Desive服务器的主干.js客户端 我想用重定向实现注销过程 这是我的客户端代码 $.ajax url: "/sign_out" xhrFields: 'X-CSRF-Token': $('meta[name=csrf-token]').attr('content') type: "DELETE" complete: xCompleteFunction = (XMLHttpRequest, textStatus) -> #handl
$.ajax
url: "/sign_out"
xhrFields:
'X-CSRF-Token': $('meta[name=csrf-token]').attr('content')
type: "DELETE"
complete: xCompleteFunction = (XMLHttpRequest, textStatus) ->
#handle here?
请求由适当控制器的方法处理。那我有
def after_sign_out_path_for(resource)
root_path
end
这是日志
[2012/12/11 15:44:07] (INFO) 76430 Started DELETE "/sign_out"
[2012/12/11 15:44:07] (INFO) 76430 Processing by Devise::SessionsController#destroy as */*
....
[2012/12/11 15:44:07] (INFO) 76430 Redirected to http://localhost:3000/
hover,重定向由Rails控制器处理,实际上重定向使用了相同的动词“DELETE”
是否可以在客户端上处理重定向,并防止Rails控制器捕获它?我原以为Deave会因为ajax调用而将301/302返回给客户端。我也在寻找这个问题的答案。我不太确定在发送第一个删除请求以注销用户之后,如何处理Desive发出的第二个重定向。但是我发现添加一个捕获401(未经授权)响应的ajax初始化代码可以解决这个问题
$.ajaxSetup({
statusCode: {
401: function(){
// Redirect the to the login page.
location.href = "/admin/auth/sign_in";
}
}
});
希望能有帮助。干杯。我也在寻找这个问题的答案。我不太确定在发送第一个删除请求以注销用户之后,如何处理Desive发出的第二个重定向。但是我发现添加一个捕获401(未经授权)响应的ajax初始化代码可以解决这个问题
$.ajaxSetup({
statusCode: {
401: function(){
// Redirect the to the login page.
location.href = "/admin/auth/sign_in";
}
}
});
希望能有帮助。干杯。之所以会出现这种情况,是因为默认情况下,您的Ajax调用遵循302(“临时移动”),而不是错误状态,而是在位置标头存在的情况下重试第二个请求 在js代码成功回调中更改状态并重定向到location头,或者返回nil位置并在客户端处理重定向
如果您想通过json和html区分登录,那么只需在控制器代码中添加self.request.format.symbol条件。这是因为默认情况下,您的Ajax调用遵循302(“临时移动”),而不是错误状态,而是在存在位置标头的情况下重试第二个请求 在js代码成功回调中更改状态并重定向到location头,或者返回nil位置并在客户端处理重定向
如果您想通过json和html区分登录,只需在控制器代码中添加self.request.format.symbol上的条件。我实际上也遇到了同样的问题。可以覆盖
designe::sessioncontroller
,我就是这样解决的
在designe::sessioncontroller
中,有一个#respond#u to_on_destroy
,它实际上实现了重定向。通过覆盖这个,它只有200个
class sessioncontroller
这样做有一个明显的问题,即覆盖像这样的私有方法不是很好(使用它的实现可能会在我们没有意识到的情况下发生变化),但我找不到任何其他方法可以很好地做到这一点。在这种情况下,如果Desive允许您进行渲染而不是重定向,那就太好了。我实际上也遇到了同样的问题。可以覆盖
designe::sessioncontroller
,我就是这样解决的
在designe::sessioncontroller
中,有一个#respond#u to_on_destroy
,它实际上实现了重定向。通过覆盖这个,它只有200个
class sessioncontroller
这样做有一个明显的问题,即覆盖像这样的私有方法不是很好(使用它的实现可能会在我们没有意识到的情况下发生变化),但我找不到任何其他方法可以很好地做到这一点。如果Desive允许您在这种情况下进行渲染而不是重定向,那就太好了