使用axios在rails上删除重复方法

ytb*_*yan 1 ruby-on-rails axios

由于以前的问题,我必须//= require jquery_ujs从application.js中删除

现在,我需要/users/sign_out使用axios用ajax 替换方法.以下是我的代码:

axios.delete("users/sign_out", { 
  headers: { 
    "X-CSRF-Token": $('meta[name="csrf-token"]').attr('content') },
  params: { 
    "authenticity_token": $('meta[name="csrf-token"]').attr('content')
  }
})
.then(function(response) {
    alert(response)
})
.catch(function(error) {
    alert(error)
})           
Run Code Online (Sandbox Code Playgroud)

服务器日志显示删除"/ users/sign_out"后右侧有一个DELETE"/".这是不正确的.

Started DELETE "/users/sign_out?authenticity_token=mHQ3d4lJzDNS5TSWEFkDZ%2F3fI0vTDFxW6CabEffaNk6h2JRYNk8kkgCSBOXFdHmgDKcVtY8e29aGU%2F3q9gajWA%3D%3D" for 127.0.0.1 at 2017-08-01 20:59:55 +0800
Processing by Devise::SessionsController#destroy as HTML
  Parameters: {"authenticity_token"=>"mHQ3d4lJzDNS5TSWEFkDZ/3fI0vTDFxW6CabEffaNk6h2JRYNk8kkgCSBOXFdHmgDKcVtY8e29aGU/3q9gajWA=="}
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
   (0.2ms)  BEGIN
   (0.2ms)  COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 8ms (ActiveRecord: 0.9ms)


**Started DELETE "/" for 127.0.0.1 at 2017-08-01 20:59:55 +0800**

ActionController::RoutingError (No route matches [DELETE] "/"):
Run Code Online (Sandbox Code Playgroud)

小智 5

TL; DR - config.sign_out_via = :get在initializers/devise.rb中设置

设计是从一个服务器响应redirect_toDELETE /users/sign_out被请求.rails使用的默认HTTP状态代码redirect_to302 Found.该302状态最初是为了表明浏览器应该使用相同的方法重试相同的请求,但许多浏览器在早期就已经破坏了这种情况,这些浏览器会GET自动更改请求方法(请参阅RFC 1945注意事项302 Moved Temporarily)

为Rails文档redirect_to还具有关于此的注解特别因为它涉及到通过AJAX非标准的HTTP请求方法:

如果您使用GET或POST以外的XHR请求并在请求后重定向,则某些浏览器将使用原始请求方法跟踪重定向.这可能会导致不良行为,例如双重DELETE.

解决方案是返回303 See Other如下:redirect_to resource_path, status: 303.我已经找到了一种设置HTTP状态的方法,Devise::SessionsController#destroy并且它现在似乎在Devise API中不存在.

但是,您可以告诉Devise使用GET作为在Devise初始化程序中注销的请求方法:

# in initializers/devise.rb
Devise.setup do |config|
  . . .
  config.sign_out_via = :get
  . . . 
end
Run Code Online (Sandbox Code Playgroud)

现在,当您访问注销链接时,您应该GET /users/sign_out在服务器日志中看到,浏览器重定向也应该使用GET.

我用来研究这个问题的其他一些资源: