提问



我已经在我的应用程序上安装了设计并在我的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部分。另外,请注意,要使其工作,你还必须在你的布局文件中包含<%= javascript_include_tag :defaults %>(application.html.erb)。

其它参考1


我在devise.rb中更改了这一行:


config.sign_out_via = :delete





config.sign_out_via = :get


它开始为我工作。

其它参考2


您可能没有包含jquery_ujs javascript文件。请确保您使用的是最新版本的jquery-ujs:https://github.com/rails/jquery-ujs以及最后可用的文件:[83]


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)中记录的链接:[84]


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


一切都会好起来的。

其它参考3


通过使用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. devise.rb中将config.sign_out_via更改为:get(不推荐,因为DELETE是相应的RESTful查询)

  2. 或将link_to更改为= button_to('Logout', destroy_user_session_path, :method => :delete)。使用button_to Rails将在进行正确的DELETE调用时进行繁重的工作。然后,如果愿意,您可以将按钮设置为看起来像链接。


其它参考4


尝试添加一个新路由到devise/sessions#destroy并链接到那个。例如:


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


视图:


<%= link_to "Logout", logout_path %>

其它参考5


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


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

其它参考6


在routes.rb文件中使用它:


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

其它参考7


除了一个例外,Jessie的回答对我有用:


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


更改:


:delete


... 至:


'delete'


所以适合我的代码是:


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

其它参考8


许多问题的答案已经存在。对我来说,问题有两个:



  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。糟糕的选择。 Devise正在使用jQuery伪造DELETE请求并将其作为GET发送。因此,您需要:


    //= require jquery
    //= require jquery_ujs
    

  4. 当然与前面提到的许多链接相同:


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


其它参考9


加:


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


其他选项是将注销配置为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


如果您使用的是Rails 3.1,请确保您的application.html.erb注销如下:


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


并且您的javascript包含行如下所示


<%= javascript_include_tag 'application' %>


我猜想有些宝石会覆盖default.js位置的新结构。

其它参考12


在github中查看源代码:


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



  • #用于注销资源的默认HTTP方法。默认是:get。
    188

  • #config.sign_out_via =:get
    187

  • #用于注销资源的默认HTTP方法。默认是:删除。
    188

  • config.sign_out_via =:删除


其它参考13


好吧,对我来说这只是删除了:method =>:delete


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

其它参考14


这意味着在安装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

其它参考15


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


尽管有:method =>:delete,sign_out链接仍无法正常工作。


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


当我将它们从:默认为之前移动之后,sign_out再次开始工作。


希望这有助于某人。

其它参考16


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


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


jquery_ujs包含到我的rails应用程序中,它现在可以使用了。

其它参考17


大多数答案都是部分的我多次遇到过这个问题。需要解决两件事:


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


需要指定delete方法


然后设计使用jquery,所以你需要加载它们


   <%= javascript_include_tag "myDirectiveJSfile" %> 


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


//= require jquery
//= require jquery_ujs

其它参考18


如果您正在使用带有设计的HTTPS,那么如果您的注销链接是非安全版本,它将会中断。在后端,它重定向到安全版本。该重定向是一个GET,导致问题。[86]


确保您的链接使用HTTPS。您可以在您的网址助手中使用protocol: "https"强制它(确保使用网址助手而不是路径助手)。


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

其它参考19


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

其它参考20


在您的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 %>

其它参考21


这就是我所做的(使用Rails 3.0和Devise 1.4.2):



  1. 确保您的网页加载rails.js

  2. 使用此参数:data-method=>delete

  3. 添加此参数的好主意:: rel =>nofollow


其它参考22


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

其它参考23


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


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


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

其它参考24


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


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

其它参考25


使用:get:delete方法为您的路径:


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

其它参考26


在devise_for:users之前查看您的routes.rb是否有resource:users然后尝试交换它们:



  1. 作品



    • devise_for:users

    • 资源:用户


  2. 失败



    • 资源:用户

    • devise_for:users



其它参考27


通常当你得到没有路线匹配但你认为你已经定义了那条路线时,仔细检查该路线的http动词/请求方法(无论是获取,放置,发布,删除等)


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

其它参考28


我知道这是一个基于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>


希望有助于从这个非常令人沮丧的洞中挖掘出一个人!