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

vic*_*ich 385 routes ruby-on-rails devise ruby-on-rails-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>
Run Code Online (Sandbox Code Playgroud)

我跑了rake routes并确认所有路线都有效.

另外,在我的routes.rb文件中我有devise_for :usersroot :to => "home#index".

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

No route matches "/users/sign_out"
Run Code Online (Sandbox Code Playgroud)

是什么导致错误?

Jes*_*ker 567

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

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
Run Code Online (Sandbox Code Playgroud)

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

  • 有关更多信息,在最新版本的Devise中更改此原因的原因在[此处](https://github.com/plataformatec/devise/issues/431)和[here](http://groups.google的.com /组/ plataformatec-色器件/ browse_thread /线程/ 99d466710a95a72/965df9eac3afab89?LNK = GST&q = DELETE#965df9eac3afab89). (23认同)
  • 我做了测试,它对我有用.不要忘记事情从一个版本变为另一个版本(无论是在Rails还是Devise中).此外,退出是状态改变行为,不应该使用GET方法(我谦虚地认为). (8认同)
  • 我遇到了同样的问题,Jessie的建议对我有用.我希望任何正在通过设计轨道广播运行的人最终都会因为这一变化而终于来到这里...... (6认同)
  • 我可以肯定地说,我从未在任何Rails应用程序中这样做过.`link_to"注销",destroy_user_session_path`对我来说一直都很好. (3认同)
  • 你也可以在你的网络控制台中输入它来测试它`$("<a href='/users/sign_out' data-method='delete'>退出</a>").appendTo('body') ;` - 如果在页面上加载了jQuery. (2认同)

kit*_*sai 133

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

config.sign_out_via = :delete
Run Code Online (Sandbox Code Playgroud)

config.sign_out_via = :get
Run Code Online (Sandbox Code Playgroud)

它开始为我工作.

  • 以前的方式是使用"GET/users/sign_out"注销,但是他们将其更改为"DELETE"以使其更加RESTful.作者解释说,GET不应该对服务器进行更改,例如注销. (22认同)
  • 如果您希望支持多种方法,也可以使用数组.例如:`config.sign_out_via = [:post,:delete]`或`devise_for:users,:sign_out_via => [:post,:delete]`,如[devise/rails/routes.rb]中所述(https: //github.com/plataformatec/devise/blob/f49b605514910b9fa145cf9e548430434b5a3e51/lib/devise/rails/routes.rb#L92). (8认同)
  • 这对我有用.虽然我很欣赏它不是最佳实践,但其他答案都失败了.我看不出为什么!! (2认同)
  • 我不会使用GET请求注销,因为它会打开用户直到XSRF攻击.(黑客使用src ="http://foo.com/users/sign_out"创建一个带有图像标记的网站,用户访问它并注销). (2认同)

Gra*_*vis 60

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

rails generate jquery:install
Run Code Online (Sandbox Code Playgroud)

你应该不会有任何更多的rails.js文件.如果你这样做,你可能已经过时了.确保此文件在config/application.rb中加载了默认值

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
Run Code Online (Sandbox Code Playgroud)

(同样,你应该不会有rails.js这里提交).最后,添加Devise wiki(haml-style)中记录的链接:

= link_to('Logout', destroy_user_session_path, :method => 'delete')
Run Code Online (Sandbox Code Playgroud)

一切都会好起来的.

  • 我在我的link_to中有:method =>'delete',问题是没有包含jquery_ujs,这个解决方案解决了我的问题.记得把gem'jquery-rails'放在你的gemfile中. (8认同)
  • 谢谢这对我有用.您也可以使用`javascript_include_tag"jquery_ujs"`而不是使用默认值 (2认同)

Wil*_*han 31

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

但是,如果您没有jquery-ujs安装gem 或未在application.html中调用生成的javascript = javascript_include_tag "application",则响应将作为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_toRails可以完成正确的DELETE调用.然后,您可以根据需要将按钮设置为类似链接的样式.


Kev*_*soi 24

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

routes.rb
devise_for :users do
  get 'logout' => 'devise/sessions#destroy'
end
Run Code Online (Sandbox Code Playgroud)

视图:

<%= link_to "Logout", logout_path %>
Run Code Online (Sandbox Code Playgroud)

  • 永远不会有登出路径作为GET. (6认同)
  • 这对我也有用.其他方法都没有. (3认同)

小智 13

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

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
Run Code Online (Sandbox Code Playgroud)


小智 13

在routes.rb文件中使用它:

devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
end
Run Code Online (Sandbox Code Playgroud)


Gal*_*len 10

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

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
Run Code Online (Sandbox Code Playgroud)

更改:

:delete
Run Code Online (Sandbox Code Playgroud)

... 至:

'delete'
Run Code Online (Sandbox Code Playgroud)

所以适合我的代码是:

<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
Run Code Online (Sandbox Code Playgroud)


Luk*_*yka 9

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

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

    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我得到警告,这是折旧的,所以我用以下代替:

    devise_scope :users do
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我以为我会删除我的jQuery.糟糕的选择.Devise正在使用jQuery"伪造"DELETE请求并将其作为GET发送.因此,您需要:

    //= require jquery
    //= require jquery_ujs
    
    Run Code Online (Sandbox Code Playgroud)
  4. 当然,与前面提到的许多链接相同:

    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
    
    Run Code Online (Sandbox Code Playgroud)


Ama*_*r S 7

加:

  <%= csrf_meta_tag %>  and 
  <%= javascript_include_tag :defaults %>  to layouts
Run Code Online (Sandbox Code Playgroud)

使用这些link_to标签

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

  or

 link_to 'Sign out', '/users/sign_out', :method => :delete
Run Code Online (Sandbox Code Playgroud)

在路线中添加:

  devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
Run Code Online (Sandbox Code Playgroud)


Rod*_*res 7

其他选项是将注销配置为GET而不是DELETE,您可以这样做添加以下行 /config/initializers/devise.rb

config.sign_out_via = :get
Run Code Online (Sandbox Code Playgroud)

但正如Steve Klabnik在他的博客上所写(http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html )因为这种方法的语义,尝试使用DELETE.


小智 6

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

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

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

<%= javascript_include_tag 'application' %>

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


小智 5

在github中查看源代码:

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

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


wor*_*mer 5

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

<%= link_to('Sign out', destroy_user_session_path) %>
Run Code Online (Sandbox Code Playgroud)


Gre*_*reg 5

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

"sign_out"链接不起作用,尽管有:method =>:delete.

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

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

希望这有助于某人.


Dee*_*ane 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不会默认编写.


The*_*Log 5

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

//= require_self
//= require jquery
//= require jquery_ujs
Run Code Online (Sandbox Code Playgroud)

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


Jer*_*ome 5

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

<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
Run Code Online (Sandbox Code Playgroud)

需要指定delete方法

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

   <%= javascript_include_tag "myDirectiveJSfile" %> 
Run Code Online (Sandbox Code Playgroud)

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

//= require jquery
//= require jquery_ujs
Run Code Online (Sandbox Code Playgroud)