【问题标题】:Devise handle sign-out redirect in ajax在ajax中设计句柄注销重定向
【发布时间】:2012-12-11 14:58:59
【问题描述】:

我有一个带有 Rails/Devise 服务器的 Backbone.js 客户端。

我想用重定向实现注销过程。

这是我的客户端代码

$.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/

Hoverer,重定向由 Rails 控制器处理,实际上重定向使用了相同的动词“DELETE”。

[2012/12/11 15:44:13] (INFO) 76430 Started DELETE "/" 
[2012/12/11 15:44:13] (INFO) 76430 Processing by HomeController#index as */*

是否可以在客户端处理重定向,并防止 Rails 控制器捕获它?由于 ajax 调用,我期待设计将 301/302 返回给客户端。

【问题讨论】:

    标签: ruby-on-rails-3 jquery devise


    【解决方案1】:

    我实际上也遇到了同样的问题。可以覆盖Devise::SessionsController,我就是这样解决的。

    在Devise::SessionsController 中,有一个method #respond_to_on_destroy 实际上会进行重定向。通过覆盖它,它只有 200 个。

    class SessionsController < Devise::SessionsController
    
      private
    
      # We sign out using Ajax calls so we override this method to render plain
      # text instead of redirecting unnecessarily
      def respond_to_on_destroy
        respond_to do |format|
          format.all { head :no_content }
          format.any(*navigational_formats) { render plain: "Signed out" }
        end
      end
    end
    

    这有一个明显的问题,因为重写这样的私有方法并不是很好(使用它的实现可能会在我们没有意识到的情况下发生变化),但我找不到任何其他方法来很好地做到这一点。在这种情况下,如果 Devise 允许您渲染而不是重定向,那就太好了。

    【讨论】:

      【解决方案2】:

      我也在寻找这个问题的答案。在为注销用户而发送的第一个 DELETE 请求之后,我不确定如何处理第二个重定向设计。但是here我发现添加一个捕获401(未经授权)响应的ajax初始化代码可以解决问题。

      $.ajaxSetup({
        statusCode: {
          401: function(){
            // Redirect the to the login page.
            location.href = "/admin/auth/sign_in";
          }
        }
      });
      

      希望对您有所帮助。干杯。

      【讨论】:

        【解决方案3】:

        发生这种情况是因为默认情况下,您的 Ajax 调用遵循 302(“临时移动”)不是错误状态,而是在位置标头存在时重试第二次请求。

        要么更改状态并重定向到 js 代码成功回调中的位置标头,要么返回 nil 位置并在客户端处理重定向。

        如果您想通过 json 和 html 区分登录,只需在控制器代码中添加 self.request.format.symbol 条件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-23
          • 1970-01-01
          • 2012-06-30
          • 2018-12-17
          • 1970-01-01
          • 2017-08-07
          • 2017-06-01
          • 2012-11-05
          相关资源
          最近更新 更多