所以我四处寻找这个问题的解决方案,而且大多数人似乎都说同样的事情,这对解决我的问题没有太大作用。我在链接中指定了删除方法,但路由错误说它是GET请求。任何想法为什么下面的链接最终会覆盖/忽略方法声明?
<%= link_to "sign out", destroy_user_session_path, :method => :delete %>
路线
devise_for :users do
get 'logout' => 'sessions#destroy', :as => :destroy_user_session
get 'login' => 'devise/sessions#new'
end
答案 0 :(得分:3)
在config/initializers/devise.rb
中,将用于注销资源的默认HTTP方法更改为:get。默认值为:delete。
config.sign_out_via = :get
答案 1 :(得分:2)
不要使用GET来破坏会话,因为它会让你打开CSFR,在这种情况下这不是什么大不了的事情 - 但仍然不是一件好事。并且,它不遵循REST约定。
如果您在设计路线中使用SSL,那么当您尝试从“http”网址注销时,它会正确发送DELETE请求,然后通过GET重定向到“https”版本。
通过将(协议:'https')添加到注销网址来解决此问题,如下所示:
= link_to "Logout", destroy_user_session_url(protocol: 'https'), method: :delete
注意:使用'url'代替'path'非常重要。
希望有所帮助。
答案 2 :(得分:1)
我所做的就是改变:
get 'logout' => 'sessions#destroy', :as => :destroy_user_session
到
delete 'logout' => 'sessions#destroy', :as => :destroy_user_session
并改变了:
destroy_user_session_path
到
destroy_user_session_url
我注释掉了:
config.sign_out_via = :get
在config / initializers / devise.rb中,因为默认值为:delete(传统且安全)。
快乐的编码!
答案 3 :(得分:0)
我认为这是因为你在路线声明中使用'get'而不是'delete'。 尝试在“注销”路线中通过“删除”更改“获取”:
devise_for :users do
delete 'logout' => 'sessions#destroy', :as => :destroy_user_session
get 'login' => 'devise/sessions#new'
end
答案 4 :(得分:0)
检查是否包含jquery和jquery_ujs
<%= javascript_include_tag "jquery", "jquery_ujs" %>
如果不包含它。它解决了这个问题。