没有路线匹配“/ users / sign_out”devise轨道3

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

单击“注销”链接时,出现以下路由错误:

 No route matches "/users/sign_out" 

任何想法是什么导致了错误?

我认为退出的路线是一个DELETE方法。 这意味着您的退出链接需要如下所示:

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

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

我在devise.rb中改了这行:

 config.sign_out_via = :delete 

 config.sign_out_via = :get 

它开始为我工作。

您可能没有包含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)中logging的链接:

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

一切都会好的。

通过使用rails code = link_to('Logout', destroy_user_session_path, :method => :delete)可以使Logout链接成为DELETE RESTful调用的html属性data-method = "delete"

但是,如果您没有安装gem jquery-ujs或者没有在您的application.html via = javascript_include_tag "application"调用生成的javascript,则响应将作为GET请求发送,并且路由将失败。

如果你不想使用jquery-ujs或者找不到使其工作的方法,你有几个选项:

  1. config.sign_out_via更改为等于:getdevise.rb :get (不推荐,因为DELETE是适当的REST式查询)
  2. 或者将link_to改为= button_to('Logout', destroy_user_session_path, :method => :delete) 。 使用button_to Rails将会对进行正确的DELETE调用做很多事情。 如果你愿意的话,你可以将buttondevise成一个链接。

尝试添加一个新的路线devise/会议#销毁和链接到。 例如:

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

视图:

 <%= link_to "Logout", logout_path %> 

在您的routes.rb文件中使用它:

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

我有与轨道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' %> 

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

  1. 当我展开我的路线时:

     devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end 
  2. 我得到警告,这是贬值,所以我已经取代它:

     devise_scope :users do get '/users/sign_out' => 'devise/sessions#destroy' end 
  3. 我以为我会删除我的jQuery。 不好的select。 Devise正在使用jQuery来“伪造”DELETE请求并将其作为GET发送。 所以你需要:

     //= require jquery //= require jquery_ujs 
  4. 当然也和之前提到的一样:

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

其他选项是将注销configuration为GET而不是DELETE,可以在/config/initializers/devise.rb中添加以下行

 config.sign_out_via = :get 

但正如Steve Klabnik在他的博客上所写的( )尝试使用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 (date:2011年6月27日)

  • #用于注销资源的默认HTTP方法。 默认是:get。 188
  • #config.sign_out_via =:得到187
  • #用于注销资源的默认HTTP方法。 默认是:删除。 188
  • :config.sign_out_via =:删除

那么,对我来说,只是删除:方法=>:删除

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

这意味着在安装了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, :method => :delete %> <%= link_to "Sign out", destroy_user_session_path %>更改为<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

通常:method => :delete不是默认写入的。

我想补充一点,即使有点旧了。

尽pipe有:method =>:delete,但是“sign_out”链接不起作用。

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

当我将它们从:defaults移到之前时,sign_out再次开始工作。

希望这有助于某人。

不要忘记在application.js中包含以下行(Rails 3)

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

jquery_ujs包含到我的rails应用程序中,现在就可以工作了。

大多数答案是部分的。 我已经打了很多次这个问题。 有两件事情需要解决:

 <%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %> 

需要指定删除方法

然后devise使用jQuery,所以你需要加载这些

  <%= javascript_include_tag "myDirectiveJSfile" %> 

并确保在myDirectiveJSfile.js中指定了jQuery和jquery-ujs

 //= require jquery //= require jquery_ujs 

如果您在devise中使用HTTPS,如果您的注销链接指向非安全版本,则会中断。 在后端,它redirect到安全版本。 该redirect是一个GET,这导致了问题。

确保您的链接使用HTTPS。 你可以在你的url助手中使用protocol: "https" (确保你使用了url helper而不是path助手)。

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

在您的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):

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

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

问题始于rails 3.1 … in /app/assets/javascript/只是寻找application.js。

如果该文件不存在创build一个名称的文件我不知道为什么我的文件消失或从来没有创build"rails new app"...

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

有很多解决scheme。 但大多使用这个,

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

或用适当的sign_out方法configurationdevise.rb

在devise.rb

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

使用:get:delete您的path的方法:

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

看看你的routes.rb在“devise_for:users”之前是否有“resource:users”,然后尝试交换它们:

  1. 作品

    • devise_for:用户
    • 资源:用户
  2. 失败

    • 资源:用户
    • devise_for:用户

一般情况下,当你得到“没有路由匹配”,但你认为你已经定义了这个路由,然后仔细检查该http路由的http动词/请求方法(无论是get,put,post,delete等)

如果你运行耙路线,那么你会看到预期的方法,你可以将它与请求日志进行比较。

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

我知道这是一个基于Rails 3的老问题,但我碰到并解决了Rails 4.0.4。 因此,我想我会介绍如何解决这个版本遇到这个问题的人。 你的里程可能会有所不同,但这是对我有用。

首先确保你已经安装了gem并运行bundle安装。

 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> 

希望能帮助挖掘出这个非常令人沮丧的洞!