【问题标题】:No route matches [GET] "/user/sign_out"没有路由匹配 [GET] "/user/sign_out"
【发布时间】:2014-07-28 20:34:36
【问题描述】:

所以,当我在导航栏的下拉菜单上单击“退出”时出现以下错误:

No route matches [GET] "/user/sign_out"

但是,这仅在使用下拉导航(移动设备的汉堡菜单)上的退出时发生,而不是在常规导航上单击退出时发生。

请看下面的代码:

  <div class="container demo-5">
    <div class="main clearfix">
      <div class="column">
        <div id="dl-menu" class="dl-menuwrapper">
          <button class="dl-trigger">Open Menu</button>
          <ul class="dl-menu dl-menu-toggle">
            <div id="closebtn"  onclick="closebtn()"></div>
            <% if user_signed_in? %>
            <li><%= link_to 'FAQ', faq_path %></li>
            <li><a href="#">Contact Us</a></li>
            <li><%= link_to 'My Account', account_path %></li>                    
            <li><%= link_to 'Sign Out',  destroy_user_session_path, method: 'delete' %></li> <--- this is the line
            <% else %>
            <li><%= link_to 'FAQ', faq_path %></li>
            <li><a href="#">Contact Us</a></li>
            <li><%= link_to 'Sign In', new_user_session_path %></li>
            <li><%= link_to 'Free Trial', plans_path %></li>
            <% end %>
          </ul>
        </div><!-- /dl-menuwrapper -->
      </div>
    </div>
  </div><!-- /container -->
</div>

这是有效的非下拉代码:

  <div class="signincontainer pull-right">
        <div class="navbar-form navbar-right">
          <% if user_signed_in? %>
            <%= link_to 'Sign out', destroy_user_session_path, class: 'btn signin-button', method: :delete %>
              <div class="btn signin-button usernamefont"><%= link_to current_user.full_name, account_path %></div>
          <% else %>
....rest of code here

更新错误:

ActionController::RoutingError (No route matches [GET] "/user/sign_out"):
  actionpack (4.0.4) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (4.0.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.0.4) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.0.4) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.0.4) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.0.4) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.0.4) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.0.4) lib/rails/rack/logger.rb:20:in `call'
  quiet_assets (1.0.2) lib/quiet_assets.rb:18:in `call_with_quiet_assets'
  actionpack (4.0.4) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.2) lib/rack/ru

【问题讨论】:

  • 匹配DELETE /user/sign_out
  • 干杯!那么我该如何解决这个问题?我有方法:'删除',谢谢!
  • 嘿,模型用户是由脚手架生成器创建的?如果不是,您将需要在 config/routes.rb 中提供路由(顺便说一句,这有点奇怪,因为您的 url 包含用户而不是用户。)
  • 它包含用户而不是用户,因为我有以下内容:devise_for :users, :path => "user"。请帮我完成这个工作!谢谢!

标签: ruby-on-rails ruby-on-rails-4 devise


【解决方案1】:

method 指定了must be a symbol

在不起作用的代码中,它当前是一个字符串:

link_to 'Sign Out', destroy_user_session_path, method: 'delete' 

在有效的代码中,它被正确地指定为符号:

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

【讨论】:

  • 谢谢@colinm!不幸的是,这仍然没有帮助 - 仍然出现同样的错误。还有什么可能?干杯!
【解决方案2】:

@colinm的回答是对的;但让我解释一下原因:

--

HTTP 动词

Devise sets a series of RESTful routes when you install it。在它生成的所有路由中,有destroy_user_session_path,它使用delete HTTP 动词:

 destroy_user_session DELETE /users/sign_out   {controller:"devise/sessions", action:"destroy"}

这意味着当您在link_to 方法中使用delete 方法时,此路由可用,如下所示:

<%= link_to "Log Out", destroy_user_session_path, method: :delete %>

HTML 默认为GETHTTP Verb,这意味着如果您没有在代码中明确定义method: :delete,Rails 将不会为路由寻找正确的verb

【讨论】:

  • 感谢里奇!不幸的是,这仍然没有帮助 - 仍然出现同样的错误。还有什么可能?干杯!
  • 您仍然收到错误消息?您是否尝试过重启服务器?
  • 是的,我有。这当然是一个不寻常的问题。我认为这与在下拉菜单中执行代码的方式有关,而不是在常规导航中执行代码的方式。有任何想法吗?干杯!
  • 所以,我在“打开菜单”行,它工作,但当它在菜单内时,它不起作用......请帮助!
  • 大声笑菜单有什么区别?是部分还是什么?
【解决方案3】:

让我们试试这个; 删除

devise_for :users, :path => 'user'

添加这个;

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

更多; here

最后的建议

我发现它需要 javascript 将请求转换为 DELETE;

所以

use devise_for :users, :path => 'user' in your config/routes

确保您在 application.html.erb 中加载了 javascript

<%= javascript_include_tag "application" %>

其次,确保您添加了 jqueryjquery-ujs gem 以及类似的东西;

//= require jquery
    //= require jquery_ujs

【讨论】:

  • 谢谢!但是,我的 routes.rb 中已经有“devise_for :users,:path => "user"”,我怎么能同时包含这两个,因为我遇到了重复错误。
  • 删除你已经拥有的那个或编辑你必须看起来与答案中的那个相似的那个。让我编辑以更清楚地符合您的描述。
  • 谢谢!我这样做了,但仍然收到相同的错误:“没有路由匹配 [GET]“/user/sign_out””
  • 再次,我只是在下拉导航中使用“退出”时收到错误,而不是在非下拉菜单中使用常规“退出”时出现错误。我不知道有什么区别..干杯!
  • 抱歉行应该是 get '/user/sign_out' =&gt; 'devise/sessions#destroy' 而不是 'get '/users/sign_out' => 'devise/sessions#destroy' 因为我们更改了路径名。我已经编辑了答案。
猜你喜欢
  • 2014-03-26
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2016-10-28
  • 2014-07-05
  • 2013-06-15
  • 2017-08-03
  • 2011-12-27
相关资源
最近更新 更多