没有路由匹配“;/users/sign_out”;设计轨道3

我已经在我的应用程序上安装了设计,并在我的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 :usersroot :to => "home#index"

当点击“签出”链接时,我得到以下路由错误:

No route matches "/users/sign_out"

知道是什么导致了这个错误吗?

136834 次浏览

我认为退出的路径是DELETE方法。这意味着你的签出链接需要看起来像这样:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

你的不包括:method => :delete部分。另外,请注意,为了使其工作,你还必须在布局文件(application.html.erb)中包含<%= javascript_include_tag :defaults %>

尝试添加一个新的路由来设计/sessions#destroy并链接到它。例如:

routes.rb
devise_for :users do
get 'logout' => 'devise/sessions#destroy'
end

观点:

<%= link_to "Logout", logout_path %>

你可能没有包含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文件)。 最后,添加设计维基 (haml-style)中记录的链接:

= link_to('Logout', destroy_user_session_path, :method => 'delete')

一切都会好起来的。

只有一个例外,杰西的回答对我很管用:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

变化:

:delete

... :

'delete'

所以对我有用的代码是:

<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>

我在设计中修改了这一行。

config.sign_out_via = :delete

config.sign_out_via = :get

它开始对我有用。

在github中查看源代码:

https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb(日期:2011年6月27日)

  • #用于签出资源的默认HTTP方法。默认为:get。 李188年< / > <李> #配置。Sign_out_via =:get 李187年< / >
  • #用于签出资源的默认HTTP方法。默认值为:delete。 李188年< / >
  • 配置。Sign_out_via =:delete

对我来说,就是remove:method =>:delete

<%= link_to('Sign out', destroy_user_session_path) %>

我在rails 3.1.0中遇到了同样的问题,我解决了在文件中添加以下行:

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs

这就是我所做的(Rails 3.0和design 1.4.2):

  1. 确保你的页面加载rails.js
  2. 使用这个参数:'data-method' => 'delete'
  3. 添加这个参数是个好主意::rel => 'nofollow'

问题开始于rails 3.1…在/app/assets/javascript/中查找application.js。

如果文件不存在,创建一个同名文件,我不知道为什么我的文件消失或从未在"rails new app"...上创建。

该文件是jquery...的实例。

我想补充一点,尽管它有点老了。

“sign_out”链接没有工作,尽管有:method =>:delete。

注释指出<%= javascript_include_tag :defaults %>必须包括提醒我,我最近添加了JQuery java脚本,并使用简单的<script src=""/>标记来包括它们。

当我把它们从:defaults后面移到前面时,sign_out又开始工作了。

希望这能帮助到一些人。

添加:

  <%= 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' %>

我的猜测是一些宝石覆盖了default.js位置的新结构。

这意味着在安装jquery-rails gem之后还没有生成jquery文件。首先你需要生成它。

rails generate devise:install

第一选择:

这意味着你必须改变/config/initializers/devise.rb上的下面一行

配置。Sign_out_via =:delete to 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默认不写。

在你的路线上使用它。rb文件:

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

看看你的路线。Rb有一个“resource:users”在“belonge_for:users”之前,然后尝试交换它们:

  1. < p >工作

    • devise_for:用户
    • 资源:用户
    • 李< / ul > < / >
    • < p >失败

      • 资源:用户
      • devise_for:用户
      • 李< / ul > < / >

在你的路线上。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代码= 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或者找不到让它工作的方法,你有几个选择:

  1. config.sign_out_via更改为devise.rb中的:get(不建议,因为DELETE是合适的RESTful查询)
  2. 或将link_to改为= button_to('Logout', destroy_user_session_path, :method => :delete)。使用button_to, Rails将在进行正确的DELETE调用时完成繁重的工作。然后,如果您愿意,可以将按钮样式设置为看起来像一个链接。

不要忘记在你的application.js (Rails 3)中包含下面这行代码

//= require_self
//= require jquery
//= require jquery_ujs

包括jquery_ujs到我的rails应用程序,它现在工作。

这个问题已经有很多答案了。对我来说,问题有两个方面:

  1. 当我扩展我的路由:

    devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  2. I was getting warning that this is depreciated so I have replaced it with:

    devise_scope :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  3. I thought I will remove my jQuery. Bad choice. Devise is using jQuery to "fake" DELETE request and send it as GET. Therefore you need to:

    //= require jquery
    //= require jquery_ujs
    
  4. and of course same link as many mentioned before:

    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
    

页面中的':method => :delete是'data-method="delete"' 所以你的页面必须有jquery_ujs.js,它将提交链接的方法是delete而不是get

一般来说,当你得到“没有路由匹配”,但你认为你已经定义了路由,那么再次检查该路由的HTTP动词/请求方法(是否为get、put、post、delete等)

如果您运行rake路由,那么您将看到预期的方法,您可以将其与请求日志进行比较。

有很多解决方案。但主要是用这个,

<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>

或者配置设计。Rb使用正确的sign_out方法

在devise.rb

config.sign_out_via = :delete ( or  :get which u like to use.)

大多数答案都是片面的。这个问题我已经遇到过很多次了。有两件事需要解决:

<%= 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

如果你正在使用HTTPS与设计,如果你的签出链接指向非安全版本,它就会断开。在后端,它重定向到安全版本。这个重定向是一个GET,它导致了这个问题。

确保你的链接使用HTTPS。你可以在你的url帮助器中强制使用protocol: "https"(确保你使用url帮助器而不是路径帮助器)。

<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>

对路径使用:get:delete方法:

devise_scope :user do
match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
  devise_for :users
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end

我知道这是一个基于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 >
<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>

希望这能帮助一些人走出这个非常令人沮丧的洞!

我正在使用rails。所以这就是我必须要做的。重要的位是data: { turbo_method: :delete }

<%= link_to t('nav.logout'), destroy_user_session_path, class: "nav-link", data: { turbo_method: :delete } %>

下面是rails在生成项目时创建的默认值。

application.html.erb

<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>

application.js

import "@hotwired/turbo-rails"
import "./controllers"
import * as bootstrap from "bootstrap"

For Rails 7

我们在importmap中手动导入jquery和jquery-ujs。rb:

pin "jquery", to: "https://ga.jspm.io/npm:jquery@3.6.0/dist/jquery.js"
pin "jquery-ujs", to: "https://cdnjs.cloudflare.com/ajax/libs/jquery-ujs/1.2.3/rails.min.js"

或者对于jquery使用:

./bin/importmap pin jquery

并手动输入jquery-ujs的第二行
< / p >

我们用以下代码创建文件:app / javascript / src / jquery.js:

import jquery from 'jquery'
window.jQuery = jquery
window.$ = jquery

然后我们将它们导入app/javascript/application.js:

import "src/jquery"
import "jquery-ujs"

并且我们不需要改变design .rb的配置。Sign_out_via =:delete就完成了

**注意:对于jquery可能需要一个yarn,如果由于某些原因上面的不工作