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_to时DELETE /users/sign_out被请求.rails使用的默认HTTP状态代码redirect_to是302 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.
我用来研究这个问题的其他一些资源: