设计没有路由匹配[GET]“/ users / sign_out”来自指定删除的链接

时间:2013-10-16 21:10:46

标签: ruby-on-rails authentication devise

所以我四处寻找这个问题的解决方案,而且大多数人似乎都说同样的事情,这对解决我的问题没有太大作用。我在链接中指定了删除方法,但路由错误说它是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

5 个答案:

答案 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" %>

如果不包含它。它解决了这个问题。