我的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
答案 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
如设计文档中所述。