2014-03-18 24 views
8

注销链接在我的rails应用程序中不起作用。找不到id = sign_out的用户

我检查了下面列出的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 
+0

可能重复[问题注销与我的应用程序设计](http://stackoverflow.com/questions/6596936/problem-signing-out-with-devise-on-my-app) – BrokenBinary

回答

0

您需要移动:

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

在你devise_scope。 Rails正在从路由文件顶部寻找路由。您的注销网址匹配users/:id,因此它正在尝试使用sign_out作为ID来呈现显示操作。

UPDATE:

其实,你真的需要在您的devise_scope块中的最后一行?

+0

谢谢@BroiSatse它是'devise_scope'块的底线,正在打破它。 感谢帮助! – PatGW

10

我有同样的问题,我的路线是在正确的顺序,正确使用link_to方法和轨道不断触发用户/:id路由:id =>:sign_out 我想通了,因为我删除了jquery_ujs从我的application.js文件...

jquery_ujs处理中的链接数据-method属性(由的link_to生成当您使用方法选项),这是用来确定这里解释了正确的路线:http://robots.thoughtbot.com/a-tour-of-rails-jquery-ujs

所以只要确保你有以下包含在你的application.js

//= require jquery 
//= require jquery_ujs 
+1

这是绝对正确的。我复制了一个新的引导主题,突然出现这个错误。只要我加回来,它就起作用了。 – Donato

+0

真棒回答。在这里挣扎了一会儿,并一直盯着看起来很完美的路线。唉,这是JavaScript!我有'jquery_ujs',但它是在我的引导后,要求所以我改变了顺序:// = require jquery // = require jquery_ujs // = require bootstrap –

1

这些解决方案都不适用于我。 也正好刚刚在发展模式,我...我 通过设置用户功能附加

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

固定它。不是最漂亮的解决方案,但它的工作原理...

2

如果您呼叫/用户/ SIGN_OUT直接从URL也不会因为工作的路线是:

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

ID EST,它使用DELETE方法。您需要将色器件初始化更改为:

config.sign_out_via = :get 

另一种选择是创建一个小的形式及其与DELETE作为方法按钮。

0

由于其他答案都不起作用,我发现您可以按照here所述更改每个Devise端点的基本路径。所以,我所做的就是给用户devise_forroutes.rb

devise_for :users, 
     path: 'devise' 

然后,我所有的设计路线开始devise,而不是users这样的矛盾就消失了。