我在我的应用上安装了设计并在我的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 routes
并确认所有路线都有效。
另外,在我的routes.rb
文件中,我有devise_for :users
和root :to => "home#index"
。
单击“退出”链接时出现以下路由错误:
No route matches "/users/sign_out"
任何想法导致错误的原因是什么?
答案 0 :(得分:562)
我认为退出的路线是DELETE
方法。这意味着您的退出链接需要如下所示:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
您的:method => :delete
部分不包括在内。此外,请注意,为了实现此目的,您还必须在布局文件(<%= javascript_include_tag :defaults %>
)中加入application.html.erb
。
答案 1 :(得分:131)
我在devise.rb中修改了这一行:
config.sign_out_via = :delete
到
config.sign_out_via = :get
它开始为我工作。
答案 2 :(得分:60)
您可能没有包含jquery_ujs javascript文件。确保您使用的是最新版本的jquery-ujs:https://github.com/rails/jquery-ujs以及最后可用的文件:
rails generate jquery:install
你应该不还有更多的rails.js文件。如果你这样做,你可能已经过时了。 确保此文件在config / application.rb
中加载了默认值config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
(同样,你应该不这里有rails.js文件)。 最后,添加Devise wiki(haml-style):
中记录的链接= link_to('Logout', destroy_user_session_path, :method => 'delete')
一切都会好的。
答案 3 :(得分:31)
通过使用rails代码data-method = "delete"
,使Logout链接成为DELETE RESTful调用的能力需要html属性= link_to('Logout', destroy_user_session_path, :method => :delete)
。
但是,如果您没有安装gem jquery-ujs
或未通过= javascript_include_tag "application"
在application.html中调用生成的javascript,则响应将作为GET请求发送,并且路由会失败。
如果您不想使用jquery-ujs
或无法找到使其正常工作的方法,您有几个选项:
config.sign_out_via
内将:get
更改为等于devise.rb
(不推荐,因为DELETE是相应的RESTful查询)link_to
更改为= button_to('Logout', destroy_user_session_path, :method => :delete)
。使用button_to
Rails将在进行正确的DELETE调用时进行繁重的工作。如果愿意,您可以将按钮设置为看起来像链接。答案 4 :(得分:24)
尝试添加新路由到devise / sessions#destroy并链接到该路由。例如:
routes.rb
devise_for :users do
get 'logout' => 'devise/sessions#destroy'
end
视图:
<%= link_to "Logout", logout_path %>
答案 5 :(得分:13)
我在使用rails 3.1.0时遇到了同样的问题,我解决了在文件中添加以下行:
app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
答案 6 :(得分:13)
在routes.rb文件中使用它:
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
答案 7 :(得分:10)
除了一个例外,Jessie的回答对我有用:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
变化:
:delete
......来:
'delete'
所以适合我的代码是:
<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
答案 8 :(得分:9)
这个问题的答案很多。对我来说,问题有两个:
当我扩展路线时:
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
我收到警告说这是折旧的,所以我用以下内容替换了它:
devise_scope :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
我以为我会删除我的jQuery。糟糕的选择。 Devise正在使用jQuery“伪造”DELETE请求并将其作为GET发送。因此,您需要:
//= require jquery
//= require jquery_ujs
当然与前面提到过的链接相同:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
答案 9 :(得分:7)
添加:
<%= 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
答案 10 :(得分:7)
其他选项是将注销配置为GET而不是DELETE,您可以在/config/initializers/devise.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。
答案 11 :(得分:6)
如果您使用的是Rails 3.1,请确保您的application.html.erb注销如下:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
您的javascript包含行如下所示
<%= javascript_include_tag 'application' %>
我猜是有些宝石会覆盖default.js位置的新结构。
答案 12 :(得分:5)
这意味着在安装jquery-rails gem之后,您还没有生成jquery文件。所以首先你需要生成它。
rails generate devise:install
第一个选项:
这意味着您必须更改/config/initializers/devise.rb
config.sign_out_via =:删除到config.sign_out_via =:get
第二个选项:
您只需在视图文件中将此行<%= link_to "Sign out", destroy_user_session_path %>
更改为<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
。
默认情况下,通常不会写:method => :delete
。
答案 13 :(得分:5)
大多数答案都是偏袒的。我多次遇到过这个问题。需要解决两件事:
<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
需要指定删除方法
然后设计使用jquery,所以你需要加载那些
<%= javascript_include_tag "myDirectiveJSfile" %>
并确保在myDirectiveJSfile.js中指定了BOTH jquery和jquery-uj
//= require jquery
//= require jquery_ujs
答案 14 :(得分:5)
不要忘记在application.js(Rails 3)
中包含以下行//= require_self
//= require jquery
//= require jquery_ujs
将jquery_ujs
包含在我的rails应用程序中,现在可以正常运行。
答案 15 :(得分:5)
我想加入这个,即使它有点旧。
“sign_out”链接不起作用,尽管有:method =&gt; :删除
表明必须包含<%= javascript_include_tag :defaults %>
的评论提醒我,我最近添加了JQuery java脚本,并使用简单的<script src=""/>
标记来包含它们。
当我将它们从:默认为之前移动之后,sign_out再次开始工作。
希望这有助于某人。
答案 16 :(得分:5)
嗯,对我来说这只是删除了:method =&gt; :删除
<%= link_to('Sign out', destroy_user_session_path) %>
答案 17 :(得分:5)
使用github中的源代码检查出来:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb(日期:2011年6月27日)
答案 18 :(得分:4)
如果您使用的是HTTPS with devise,那么如果您的退出链接指向非安全版本,它就会中断。在后端,它重定向到安全版本。该重定向是一个GET,导致问题。
确保您的链接使用HTTPS。你可以在url helper中使用protocol: "https"
强制它(确保你使用url helper而不是路径助手)。
<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
答案 19 :(得分:4)
AllowAny
答案 20 :(得分:3)
问题始于rails {...在/app/assets/javascript/
中查找application.js。
如果文件不存在,请创建一个具有该名称的文件,我不知道为什么我的文件消失或从未在"rails new app"...
上创建。
该文件是jquery...
的实例。
答案 21 :(得分:3)
有很多解决方案。但主要是使用它,
<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>
或使用正确的sign_out方法配置devise.rb
在devise.rb
config.sign_out_via = :delete ( or :get which u like to use.)
答案 22 :(得分:3)
使用:get
和:delete
方法作为您的路径:
devise_scope :user do
match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
答案 23 :(得分:2)
在您的routes.rb中:
devise_for :users do
get '/sign_out' => 'devise/sessions#destroy'
get '/log_in' => 'devise/sessions#new'
get '/log_out' => 'devise/sessions#destroy'
get '/sign_up' => 'devise/registrations#new'
get '/edit_profile' => 'devise/registrations#edit'
end
并在您的application.html.erb中:
<%if user_signed_in?%>
<li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>
答案 24 :(得分:2)
这就是我所做的(使用Rails 3.0和Devise 1.4.2):
答案 25 :(得分:1)
在“devise_for:users”之前查看您的routes.rb是否有“resource:users”,然后尝试交换它们:
作品
失败
答案 26 :(得分:1)
页面中的':method => :delete
'为“data-method="delete"
”
所以你的页面必须有jquery_ujs.js,它会提交链接方法删除而不是方法获取
答案 27 :(得分:1)
我知道这是一个基于Rails 3的旧问题,但我刚刚在Rails 4.0.4上遇到并解决了它。所以我想我是如何解决这个版本遇到这个问题的人。你的里程可能会有所不同,但这对我有用。
首先确保安装了gem并运行bundle install。
gem 'jquery-rails'
gem 'turbolinks'
gem 'jquery-turbolinks'
在application.js中检查是否需要所有内容,如下所示。
请注意这是否有问题:它是//= require jquery.turbolinks
而不是//= require jquery-turbolinks
//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require_tree .
接下来,在application.html.erb的标题中添加适当的链接。
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>
关于如何实现删除方法似乎有很多变化,我假设它取决于您使用的Rails版本。
这是我使用的delete
语法。
<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>
希望有助于从这个非常令人沮丧的洞中挖掘出一些人!
答案 28 :(得分:0)
通常当你得到“没有路线匹配”但你认为你已经定义了那条路线时,仔细检查该路线的http动词/请求方法(无论是获取,放置,发布,删除等)< / strong>即可。
如果您运行rake路线,那么您将看到预期的方法,您可以将其与请求日志进行比较。