找不到ID = sign_out的用户

注销链接在我的rails应用程序中不起作用。

我检查了下面列出的routes.rb,我的application.html.erb看起来遵循正确的路径。

得到以下错误。

ActiveRecord::RecordNotFound in UsersController#show Couldn't find User with id=sign_out Rails.root: /Users/patrickwalsh/rails_projects/ytutorial Application Trace | Framework Trace | Full Trace app/controllers/users_controller.rb:4:in `show' lib/disable_assets_logger.rb:11:in `call' 

我的routes.rb

 Refectory::Application.routes.draw do devise_for :users, :controllers => { :registrations => "users" } devise_scope :user do get 'login', to: "devise/sessions#new", as: "login" get 'logout', to: "devise/sessions#destroy", as: "logout" get 'logout', to: "users/sessions#destroy", as: "logout" get 'signup', to: "users#new", as: "signup" match '/users/:id', :to => 'users#show', :as => :user end root :to => 'tutorials#index' devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' get 'users/:id' => 'users#show' end resources :tutorials resources :comments, only: [:show, :create, :update, :destroy] resources :tutorials do member { post :vote } end if Rails.env == "development" match 'errors/404' => 'errors#error_404' match 'errors/500' => 'errors#error_500' end unless Rails.application.config.consider_all_requests_local match '*not_found', to: 'errors#error_404' end match 'tagged' => 'tutorials#tagged', :as => 'tagged' end 

和我的application.html似乎是从我能看到的正确路线。

任何帮助是极大的赞赏!

  
  • "delete") %>
  • 我的用户控制器以及我怀疑这是问题所在,但不确定错误是什么。

     class UsersController < Devise::RegistrationsController def show @user = User.find(params[:id]) @tutorials = @user.tutorials end end 

    你需要搬家:

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

    在你的devise_scope 。 Rails正在寻找路由文件顶部的路由。 您的注销url与users/:id匹配,因此它尝试使用sign_out作为ID来呈现show动作。

    更新:

    实际上,你真的需要devise_scope块中的最后一行吗?

    我遇到了同样的问题,我的路由顺序正确,link_to方法正确使用,rails继续触发users /:id路由:id =>:sign_out我想出来是因为我从application.js中删除了jquery_ujs文件…

    jquery_ujs处理链接中的data-method属性(当你使用method选项时由link_to生成),用于确定正确的路由,如下所述: http : //robots.thoughtbot.com/a-tour-of- Rails的jQuery的UJS

    因此,请确保您的application.js中包含以下内容

     //= require jquery //= require jquery_ujs 

    如果您直接从URL调用/ users / sign_out,它将无法工作,因为路由是:

     destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy 

    id est,它使用DELETE方法。 您需要将设计初始化程序更改为:

     config.sign_out_via = :get 

    另一种选择是使用DELETE作为方法创建一个小表单及其按钮。

    这些解决方案都不适合我。 它也只是在我的开发模式中…我通过添加修复它

      if params[:id] = "sign_out" sign_out current_user return end 

    在设置用户function。 不是最漂亮的解决方案,但它的工作原理……

    由于其他答案没有奏效,我发现您可以更改每个Devise端点的基本路径,如此处所述。 所以,我所做的是对devise_for上的用户routes.rb

     devise_for :users, path: 'devise' 

    然后,我的所有Devise路线都以devise而不是users开始,因此冲突消失了。

    这对我有用

     #form <%= link_to(destroy_user_session_path, {:class => "nav-link", :method => :delete}) do %>  Logout  <% end %> #routes devise_scope :user do get '/users/sign_out' => 'devise/sessions#destroy' end