我已在我的应用上安装了设计,并在我的 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"
任何想法是什么导致了错误?
gem 'devise', :git => 'git://github.com/plataformatec/devise.git'
。不过那什么也没做。
我认为退出的路线是一种 DELETE
方法。这意味着您的退出链接需要如下所示:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
您的不包括 :method => :delete
部分。此外,请注意,要使其正常工作,您还必须在布局文件 (application.html.erb
) 中包含 <%= javascript_include_tag :defaults %>
。
我在 devise.rb 中更改了这一行:
config.sign_out_via = :delete
至
config.sign_out_via = :get
它开始为我工作。
config.sign_out_via = [ :post, :delete ]
或 devise_for :users, :sign_out_via => [ :post, :delete ]
,如 devise/rails/routes.rb 中所述。
您可能没有包含 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 样式):
= link_to('Logout', destroy_user_session_path, :method => 'delete')
一切都会好起来的。
javascript_include_tag "jquery_ujs"
application.js
中删除了这一行。不好的假设,我想。谢谢。
使注销链接成为 DELETE RESTful 调用的能力需要使用 rails 代码 = link_to('Logout', destroy_user_session_path, :method => :delete)
的 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 调用。然后,您可以根据需要设置按钮的样式,使其看起来像一个链接。
button_to
,Rails 为整个操作生成一个 form
。这就是为什么可以将 :delete
方法与 button_to
一起使用而不是与 link_to
一起使用,只需查看生成的 HTML。
尝试添加一条新路由来设计/会话#destroy 并链接到该路由。例如:
routes.rb
devise_for :users do
get 'logout' => 'devise/sessions#destroy'
end
看法:
<%= link_to "Logout", logout_path %>
link_to
调用添加一个单独的参数来修复它,如另一个答案中所述。
get '/:lang/user/logout' => 'devise/session#destroy'
view <%= link_to "Logout", ??? %>
,你如何设置路径?谢谢
在您的 routes.rb 文件中使用它:
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
我在使用 rails 3.1.0 时遇到了同样的问题,我解决了在文件中添加以下行:
app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
除了一个例外,杰西的回答对我有用:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
改变:
:delete
... 至:
'delete'
所以对我有用的代码是:
<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
这个问题已经有很多答案了。对我来说,问题有两个方面:
当我扩展我的路线时: 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 发送。因此,您需要: //= 需要 jquery //= 需要 jquery_ujs,当然还有与前面提到的许多相同的链接:<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
添加:
<%= 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
其他选项是将注销配置为 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。
如果您使用的是 Rails 3.1,请确保您的 application.html.erb 注销看起来像:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
并且您的 javascript 包含行如下所示
<%= javascript_include_tag 'application' %>
我的猜测是某些 gem 会覆盖 default.js 位置的新结构。
用 github 中的源代码检查一下:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb(日期:2011 年 6 月 27 日)
# 用于注销资源的默认 HTTP 方法。默认为:获取。 188
# config.sign_out_via = :get 187
# 用于注销资源的默认 HTTP 方法。默认为:删除。 188
config.sign_out_via = :delete
好吧,对我来说,伙计们只是删除 :method => :delete
<%= link_to('Sign out', destroy_user_session_path) %>
这意味着您在安装 jquery-rails gem 后还没有生成 jquery 文件。所以首先你需要生成它。
rails generate devise:install
第一个选项:
这意味着您必须更改 /config/initializers/devise.rb
上的以下行
config.sign_out_via = :delete 到 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
。
我想补充一点,即使它有点旧了。
“sign_out”链接不起作用,尽管有:method =>:delete。
指示必须包含 <%= javascript_include_tag :defaults %>
的注释提醒我最近添加了 JQuery java 脚本并使用简单的 <script src=""/>
标记来包含它们。
当我将它们从 :defaults 之后移到之前时,sign_out 再次开始工作。
希望这可以帮助某人。
大多数答案都是片面的。我已经多次遇到这个问题。需要解决两件事:
<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
需要指定删除方法
然后设计使用jquery,所以你需要加载那些
<%= javascript_include_tag "myDirectiveJSfile" %>
并确保在 myDirectiveJSfile.js 中同时指定 jquery 和 jquery-ujs
//= require jquery
//= require jquery_ujs
不要忘记在您的 application.js (Rails 3) 中包含以下行
//= require_self
//= require jquery
//= require jquery_ujs
将 jquery_ujs
包含到我的 rails 应用程序中,它现在可以工作了。
如果您使用的是 HTTPS with devise,如果您的退出链接指向非安全版本,它就会中断。在后端,它重定向到安全版本。该重定向是一个 GET,这会导致问题。
确保您的链接使用 HTTPS。您可以在 url 助手中使用 protocol: "https"
强制它(确保使用 url 助手而不是路径助手)。
<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
devise_for :users
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end
问题始于 rails 3.1... 在 /app/assets/javascript/
中,只需查找 application.js。
如果该文件不存在,请创建一个具有该名称的文件,我不知道为什么我的文件会消失或从未在 "rails new app"...
上创建。
该文件是 jquery...
的实例。
有很多解决方案。但大多使用这个,
<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>
或使用适当的 sign_out 方法配置 devise.rb
在设计.rb
config.sign_out_via = :delete ( or :get which u like to use.)
为您的路径使用 :get
和 :delete
方法:
devise_scope :user do
match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
在您的 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 %>
这就是我所做的(使用 Rails 3.0 和 Devise 1.4.2):
确保您的页面加载 rails.js 使用此参数:'data-method' => 'delete' 添加此参数的好主意::rel => 'nofollow'
查看您的 routes.rb 在“devise_for :users”之前是否有“resource :users”,然后尝试交换它们:
作品 devise_for :users 资源 :users 资源失败 :users devise_for :users
页面中的 ':method => :delete
' 是 'data-method="delete"
' 所以你的页面必须有 jquery_ujs.js,它将使用方法 delete 而不是方法 get 提交链接
我知道这是一个基于 Rails 3 的老问题,但我只是在 Rails 4.0.4 上遇到并解决了它。所以我想我会为遇到此版本问题的任何人介绍我如何修复它。您的里程可能会有所不同,但这对我有用。
首先确保您已安装 gems 并运行 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 %>
关于如何实现 delete 方法似乎有很多变化,我认为这取决于您使用的 Rails 版本。这是我使用的 delete
语法。
<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>
希望这有助于将某人从这个非常令人沮丧的洞中挖出来!
通常,当您收到“无路由匹配”但您认为已定义该路由时,请仔细检查该路由的 http 动词/请求方法(无论是获取、放置、发布、删除等)。
如果您运行 rake 路由,那么您将看到预期的方法,您可以将其与请求日志进行比较。
我正在使用 rails 7。所以这就是我必须这样做的方式。重要的是data: { turbo_method: :delete }
<%= link_to t('nav.logout'), destroy_user_session_path, class: "nav-link", data: { turbo_method: :delete } %>
下面是我生成项目时由 rails 创建的默认值。
应用程序.html.erb
<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
应用程序.js
import "@hotwired/turbo-rails"
import "./controllers"
import * as bootstrap from "bootstrap"
link_to "Sign out", destroy_user_session_path
对我来说一直都足够好。$("<a href='/users/sign_out' data-method='delete'>Sign out</a>").appendTo('body');
- 如果页面上加载了 jQuery。