没有路由匹配“/ users / sign_out”设计rails 3

时间:2011-07-02 13:31:16

标签: ruby-on-rails ruby-on-rails-3 devise routes

我在我的应用上安装了设计并在我的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"

任何想法导致错误的原因是什么?

29 个答案:

答案 0 :(得分:562)

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

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

您的:method => :delete部分不包括在内。此外,请注意,为了实现此目的,您还必须在布局文件(<%= javascript_include_tag :defaults %>)中加入application.html.erb

答案 1 :(得分:131)

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

config.sign_out_via = :delete

config.sign_out_via = :get

它开始为我工作。

答案 2 :(得分:60)

您可能没有包含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):

中记录的链接
= link_to('Logout', destroy_user_session_path, :method => 'delete')

一切都会好的。

答案 3 :(得分:31)

通过使用rails代码data-method = "delete",使Logout链接成为DELETE RESTful调用的能力需要html属性= link_to('Logout', destroy_user_session_path, :method => :delete)

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

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

  1. config.sign_out_via内将:get更改为等于devise.rb(不推荐,因为DELETE是相应的RESTful查询)
  2. 或者将link_to更改为= button_to('Logout', destroy_user_session_path, :method => :delete)。使用button_to Rails将在进行正确的DELETE调用时进行繁重的工作。如果愿意,您可以将按钮设置为看起来像链接。

答案 4 :(得分:24)

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

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

视图:

<%= link_to "Logout", logout_path %>

答案 5 :(得分:13)

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

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

答案 6 :(得分:13)

在routes.rb文件中使用它:

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

答案 7 :(得分:10)

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

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

变化:

:delete

......来:

'delete'

所以适合我的代码是:

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

答案 8 :(得分:9)

这个问题的答案很多。对我来说,问题有两个:

  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 :(得分:7)

添加:

  <%= 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 :(得分:7)

其他选项是将注销配置为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 :(得分:6)

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

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

您的javascript包含行如下所示

<%= javascript_include_tag 'application' %>

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

答案 12 :(得分:5)

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

答案 13 :(得分:5)

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

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

需要指定删除方法

然后设计使用jquery,所以你需要加载那些

   <%= javascript_include_tag "myDirectiveJSfile" %> 

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

//= require jquery
//= require jquery_ujs

答案 14 :(得分:5)

不要忘记在application.js(Rails 3)

中包含以下行
//= require_self
//= require jquery
//= require jquery_ujs

jquery_ujs包含在我的rails应用程序中,现在可以正常运行。

答案 15 :(得分:5)

我想加入这个,即使它有点旧。

“sign_out”链接不起作用,尽管有:method =&gt; :删除

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

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

希望这有助于某人。

答案 16 :(得分:5)

嗯,对我来说这只是删除了:method =&gt; :删除

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

答案 17 :(得分:5)

使用github中的源代码检查出来:

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

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

答案 18 :(得分:4)

如果您使用的是HTTPS with devise,那么如果您的退出链接指向非安全版本,它就会中断。在后端,它重定向到安全版本。该重定向是一个GET,导致问题。

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

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

答案 19 :(得分:4)

AllowAny

答案 20 :(得分:3)

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

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

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

答案 21 :(得分:3)

有很多解决方案。但主要是使用它,

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

答案 22 :(得分:3)

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

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

答案 23 :(得分:2)

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

答案 24 :(得分:2)

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

  1. 确保您的网页加载rails.js
  2. 使用此参数:'data-method'=&gt; '删除'
  3. 添加此参数的好主意:: rel =&gt; 'nofollow的'

答案 25 :(得分:1)

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

  1. 作品

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

    • 资源:用户
    • devise_for:users

答案 26 :(得分:1)

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

答案 27 :(得分:1)

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

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

答案 28 :(得分:0)

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

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