我已经在我的应用程序上安装了设计,并在我的application.html.erb文件中应用了以下内容:

<div id="user_nav">
    <% if user_signed_in? %>
        Signed in as <%= current_user.email %>. This cannot be cheese?
        <%= link_to 'Sign out', destroy_user_session_path %>
    <% else %>
        <%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %>
    <% end %>
</div>

我运行了rake路由,确认所有路由都是有效的。

同样,在我的路线上。我有belonge_for:users和root:to => "home#index"。

当点击“签出”链接时,我得到以下路由错误:

No route matches "/users/sign_out"

知道是什么导致了这个错误吗?


当前回答

在github中查看源代码:

https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb(日期:2011年6月27日)

#用于签出资源的默认HTTP方法。默认为:get。 188 #配置。Sign_out_via =:get 187 #用于签出资源的默认HTTP方法。默认值为:delete。 188 配置。Sign_out_via =:delete

其他回答

我正在使用rails。所以这就是我必须要做的。重要的位是data: {turbo_method::delete}

<%= link_to t('nav.logout'), destroy_user_session_path, class: "nav-link", data: { turbo_method: :delete } %>

下面是rails在生成项目时创建的默认值。

application.html.erb

<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>

application.js

import "@hotwired/turbo-rails"
import "./controllers"
import * as bootstrap from "bootstrap"

Add:

  <%= csrf_meta_tag %>  and 
  <%= javascript_include_tag :defaults %>  to layouts

使用这些link_to标记

 link_to 'Sign out', destroy_user_session_path, :method => :delete

  or

 link_to 'Sign out', '/users/sign_out', :method => :delete

在路由中添加:

  devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end

有很多解决方案。但主要是用这个,

<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>

或者配置设计。Rb使用正确的sign_out方法

在devise.rb

config.sign_out_via = :delete ( or  :get which u like to use.) 

另一个选项是将注销配置为GET而不是DELETE,您可以在/config/initializers/ devie.rb上添加以下行

config.sign_out_via = :get

但正如Steve Klabnik在他的博客(http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html)上所写的,尝试使用DELETE,因为这种方法的语义。

页面中的“:method =>:delete”是“data-method="delete"” 所以你的页面必须有jquery_ujs.js,它会用delete方法提交链接,而不是用get方法