我怎样才能很好地处理色器件在AJAX 401个状态?(How can I elegantly han

2019-06-23 14:08发布

随着色器件一个使用before_filter :authenticate_user! 限制只能访问身份验证的用户。

非授权用户试图访问反正受限页,自动设计导致重定向到登录页面

因此,试图打开HTTP://本地主机:3000 /用户/编辑将导致重定向到访问http://本地主机:3000 /用户/ sign_in 。

现在,如果我定义链接的http://本地主机:3000 /用户/编辑为:remote => true ,设计只能通过发出一个JS 401个状态码

我怎样才能优雅与应对的情况,并在重叠显示登录对话框或重定向作为非远程变量会怎么做呢?

是否制定提供那种情况下,我想只需要激活一个默认的策略?

Answer 1:

$(document).ajaxError(function (e, xhr, settings) {
        if (xhr.status == 401) {
           $('.selector').html(xhr.responseText);
        }
    });


Answer 2:

这是我选择了现在的解决方案(在CoffeeScript的语法):

$ ->
  $("a").bind "ajax:error", (event, jqXHR, ajaxSettings, thrownError) ->
    if jqXHR.status == 401 # thrownError is 'Unauthorized'
      window.location.replace('/users/sign_in')

但是,这(在它自己的),只是忘记关于页面的用户最初想要参观,该组合限制住可用性。

附加(控制器)逻辑需要更优雅的处理。

UPDATE:正确重定向

在函数, this保持初始URL的用户打算去。

通过调用window.location.replace(this)而不是明确地重定向到登录页面 ),应用程序会尝试将用户重定向到最初预期的目标。

虽然仍无法(未经授权),它将会是一个GET调用(而不是JS / AJAX)。 因此设计能够踢,将用户重定向到登录页面。

从那里,制定工作像往常一样,转发用户最初预期的URL在成功注册后。



Answer 3:

一个版本的混合事件用结合location.reload()

$(function($) {
  $("#new-user")
    .bind("ajax:error", function(event, xhr, status, error) {
      if (xhr.status == 401) {  // probable Devise timeout
        alert(xhr.responseText);
        location.reload();      // reload whole page so Devise will redirect to signin
      }
    });
});

与设计3.1.1测试,这并不正确设置session["user_return_to"]使用户返回到该页面再次登录后()。

我加入了alert作为一种简单的方式来解决这里讨论的不雅信息的问题: 在使用设计回报率会话超时消息



Answer 4:

这里是我的CoffeScript复制过去,hapy(TM)解决方案。 它会将所有401到登录页面。

<% environment.context_class.instance_eval { include Rails.application.routes.url_helpers } %>

$(document).ajaxError (_, xhr)->
  window.location = '<%= new_user_session_path %>' if xhr.status == 401

而在Javascript:

<% environment.context_class.instance_eval { include Rails.application.routes.url_helpers } %>

$(document).ajaxError( function(event, xhr){
  if (xhr.status == 401) {
    window.location = '<%= new_user_session_path %>'
  }
});


Answer 5:

您可以使用上的.live“AJAX:错误”事件绑定如果你正在做“:远程=>真”。

$('#member_invite, #new_user')
        .live("ajax:success", function(evt, data, status, xhr){
          $.colorbox.close();
        })
        .live("ajax:error", function(evt, data, status, xhr){
          alert("got an error");
        });

其中“#new_user”将是格式ID值。

请注意,如果你已经有了一个覆盖或对话更优雅的方式是简单地插入一个消息,所以不是警报():

$('.messages').html('Invalid email or password');

在您的登录表单,你只是做一个

<div class="messages"></div>

或者,你甚至可以只需更换窗体的标题,什么都你的需要。



Answer 6:

我很乐意看看是否有一种优雅的方式来做到这一点!

在此之前,这里是我是如何处理它。

在你edit.js.erb查看文件,你可以把下面的代码如下:

<% case response.status
  when 200
%>
  //do what you need to do
<% when 401 %>
  //handle the 401 case, for example by redirecting to root or something
  window.location.href('/');
<% else %>
  //catch all
  alert('We\'ve had a problem, please close this, refresh the page and try again');
<% end %>

这将着眼于响应的状态代码和重定向到登录页面,如果是401。

我不知道如果没有直接在控制器级别处理此问题的方法。



文章来源: How can I elegantly handle devise's 401 status in AJAX?