我在我的应用程序上安装了devise并在我的 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"
是什么导致错误?
29 回答
不要忘记在application.js中包含以下行(Rails 3)
将
jquery_ujs
包含到我的rails应用程序中,它现在可以正常工作 .这意味着在安装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
.加:
使用这些link_to标签
在路线中添加:
其他选项是将注销配置为GET而不是DELETE,您可以在
/config/initializers/devise.rb
上添加以下行但正如Steve Klabnik在他的博客上所写(http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html )因为这种方法的语义,尝试使用DELETE .
如果您使用的是Rails 3.1,请确保您的application.html.erb注销如下:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
并且您的javascript包含行如下所示
<%= javascript_include_tag 'application' %>
我的猜测是有些宝石会覆盖default.js位置的新结构 .
我想补充一点,即使它有点旧 .
“sign_out”链接不起作用,尽管有:method =>:delete .
必须包含
<%= javascript_include_tag :defaults %>
的注释提醒我,我最近添加了JQuery java脚本,并使用简单的<script src=""/>
标记来包含它们 .当我将它们从:默认为之前移动之后,sign_out再次开始工作 .
希望这有助于某人 .
在github中查看源代码:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb(日期:2011年6月27日)
#用于注销资源的默认HTTP方法 . 默认是:get . 188
#config.sign_out_via =:得到187
#用于注销资源的默认HTTP方法 . 默认是:删除 . 188
config.sign_out_via =:删除
好吧,对我来说这只是删除了:method =>:delete
大多数答案都是部分的我多次遇到过这个问题 . 需要解决两件事:
需要指定delete方法
然后设计使用jquery,所以你需要加载它们
并确保在myDirectiveJSfile.js中指定了两个jquery和jquery-ujs
我认为退出的路线是
DELETE
方法 . 这意味着您的退出链接需要如下所示:你的不包括
:method => :delete
部分 . 此外,请注意,为此,您还必须在布局文件(application.html.erb
)中包含<%= javascript_include_tag :defaults %>
.我在devise.rb中更改了这一行:
至
它开始为我工作 .
您可能没有包含jquery_ujs javascript文件 . 确保您使用的是最新版本的jquery-ujs:https://github.com/rails/jquery-ujs以及最后可用的文件:
你不应该有更多的rails.js文件 . 如果你这样做,你可能已经过时了 . 确保此文件在config / application.rb中加载了默认值
(同样,你不应该在这里有rails.js文件) . 最后,添加Devise wiki(haml-style)中记录的链接:
一切都会好起来的 .
通过使用rails代码
= link_to('Logout', destroy_user_session_path, :method => :delete)
,使Logout链接成为DELETE RESTful调用的能力需要html属性data-method = "delete"
.但是,如果您没有安装gem
jquery-ujs
或未通过= javascript_include_tag "application"
在application.html中调用生成的javascript,则响应将作为GET请求发送,并且路由将失败 .如果您不想使用
jquery-ujs
或找不到使其工作的方法,您有几个选项:在
devise.rb
内将config.sign_out_via
更改为等于:get
(不推荐,因为DELETE是相应的RESTful查询)或者将
link_to
更改为= button_to('Logout', destroy_user_session_path, :method => :delete)
. 使用button_to
Rails将在进行正确的DELETE调用时进行繁重的工作 . 然后,您可以根据需要将按钮设置为类似链接的样式 .尝试添加一个新路由到devise / sessions#destroy并链接到那个 . 例如:
视图:
我在rails 3.1.0遇到了同样的问题,我解决了在文件中添加以下行:
在routes.rb文件中使用它:
除了一个例外,Jessie的回答对我有用:
更改:
... 至:
所以适合我的代码是:
许多问题的答案已经存在 . 对我来说,问题有两个:
如果您使用HTTPS with devise,如果您的退出链接是非安全版本,它将会中断 . 在后端,它重定向到安全版本 . 该重定向是一个GET,导致问题 .
确保您的链接使用HTTPS . 您可以在url helper中使用
protocol: "https"
强制它(确保使用url helper而不是路径助手) .问题始于rails 3.1 ...在
/app/assets/javascript/
中查找application.js .如果文件没有't exist create a file with that name I don'知道为什么我的文件消失或从未在
"rails new app"...
上创建 .该文件是
jquery...
的实例 .那里有很多解决方案 . 但主要是用这个,
或使用正确的sign_out方法配置devise.rb
在devise.rb中
使用
:get
和:delete
方法为您的路径:在您的routes.rb中:
并在您的application.html.erb中:
这就是我所做的(使用Rails 3.0和Devise 1.4.2):
确保您的页面加载了rails.js
使用此参数:'data-method' => 'delete'
添加此参数的好主意:: rel => 'nofollow'
在“devise_for:users”之前查看您的routes.rb是否有“resource:users”,然后尝试交换它们:
作品
devise_for:用户
资源:用户
失败
资源:用户
devise_for:用户
':method => :delete
' in page is 'data-method="delete"
'所以你的页面必须有jquery_ujs.js,它会提交链接方法删除而不是方法获取我知道这是一个基于Rails 3的老问题,但我刚刚在Rails 4.0.4上遇到并解决了它 . 所以我想我会如何解决这个版本遇到这个问题的人 . 你的里程可能会有所不同,但这对我有用 .
首先确保安装了gem并运行bundle install .
在application.js中检查是否需要一切如下所示 .
Beware if this gotcha :这是
//= require jquery.turbolinks
而不是//= require jquery-turbolinks
接下来,在application.html.erb的 Headers 中添加适当的链接 .
关于如何实现删除方法似乎有很多变化,我假设它取决于您使用的Rails版本 . 这是我使用的
delete
语法 .希望有助于从这个非常令人沮丧的洞中挖出一些人!
一般来说,当你得到"No route matches"但你认为你已经定义了那条路线然后 double check the http verb / request method (whether its get, put, post, delete etc.) for that route .
如果您运行rake路由,那么您将看到预期的方法,您可以将其与请求日志进行比较 .