无法找到ID = sign_out的用户

时间:2014-03-18 20:40:36

标签: ruby-on-rails ruby devise

我的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似乎遵循了我所能看到的正确路线。

非常感谢任何帮助!

<% if current_user.present? %>
          <li><%= link_to "Log out", destroy_user_session_path, (:method => "delete") %></li>
        <% else %>       
          <li><%= link_to "Log in", new_user_session_path %></li>
          <li><%= link_to "Sign up", new_user_registration_path %></li>
        <% end %>

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

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

7 个答案:

答案 0 :(得分:10)

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

jquery_ujs处理链接中的data-method属性(当您使用方法选项时由link_to生成),该属性用于确定正确的路由,如下所述:http://robots.thoughtbot.com/a-tour-of-rails-jquery-ujs < / p>

因此,请确保您的application.js

中包含以下内容
//= require jquery
//= require jquery_ujs

答案 1 :(得分:2)

如果您直接从URL呼叫/ users / sign_out,它将无法正常工作,因为路由是:

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

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

config.sign_out_via = :get

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

答案 2 :(得分:1)

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

来修复它
  if params[:id] = "sign_out"
    sign_out current_user
    return
  end
设置用户功能中的

。不是最漂亮的解决方案,但它有效...

答案 3 :(得分:1)

这对我有用

#form 

<%= link_to(destroy_user_session_path, {:class => "nav-link", :method => :delete}) do  %>
      <span class="sidebar-normal"> Logout </span>
<% end %>

#routes

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

答案 4 :(得分:0)

你需要搬家:

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

超过devise_scope。 Rails正在寻找路由文件顶部的路由。您的退出网址与users/:id匹配,因此它正在尝试呈现以sign_out为ID的展示操作。

更新:

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

答案 5 :(得分:0)

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

devise_for :users,
         path: 'devise'

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

答案 6 :(得分:0)

很抱歉把这个问题搞砸了,但“正确”的答案是不要乱七八糟地冒着破坏很多事情的风险。

如果你想在 GET 上断开连接,那么在 initializer/devise.rb

中像这样实际配置设计
  # The default HTTP method used to sign out a resource. Default is :delete.
  config.sign_out_via = :get

如设计文档中所述。