3

所以我四处寻找解决这个问题的方法,大多数人似乎都在说同样的话,但这并没有解决我的问题。我已经在链接中指定了删除方法,但路由错误说它是一个 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
4

5 回答 5

4

在您的config/initializers/devise.rb更改中,用于将资源注销的默认 HTTP 方法:get。默认值为:删除。

config.sign_out_via = :get

于 2013-10-16T22:15:14.423 回答
2

不要使用 GET 来销毁会话,因为它会打开您的CSFR,在这种情况下这并不是什么大不了的事——但仍然不是一件好事)。而且,它不遵循 REST 约定。


如果您将 SSL 用于设计路由,那么当您尝试从“http”url 注销时,它会正确发送 DELETE 请求,然后通过 GET 重定向到“https”版本。

通过将(protocol: 'https')添加到注销 url 来解决此问题,如下所示:

= link_to "Logout", destroy_user_session_url(protocol: 'https'), method: :delete

注意:使用 'url' 而不是 'path' 很重要。

希望有帮助。

于 2013-11-26T02:35:12.690 回答
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 (这是传统的和安全的)。

快乐编码!

于 2014-02-12T14:38:25.307 回答
0

我认为这是因为您在路由声明中使用“get”而不是“delete”。尝试在“注销”路线中通过“删除”更改“获取”:

  devise_for :users do
    delete 'logout' => 'sessions#destroy', :as => :destroy_user_session
    get 'login' => 'devise/sessions#new'
  end
于 2013-10-16T21:24:03.213 回答
0

检查是否包含 jquery 和 jquery_ujs

<%= javascript_include_tag "jquery", "jquery_ujs" %>

如果不包括它。就是解决这个问题。

于 2014-03-28T11:23:12.300 回答