没有路线匹配[GET]"/ signout"

And*_*raD 6 routes ruby-on-rails ruby-on-rails-3

我看到了一些与此主题相关的帖子,但给定的解决方案并没有真正为我澄清事情......

因此,我正在开发一个rails(版本3.2.2)应用程序,该应用程序遵循Michael Hartl的Ruby on Rails教程中的设置.该应用程序有一个注销链接,直到最近,当它开始给我错误"没有路由匹配[GET]"/注销"'时,它运行良好.

这些是相关的部分:

的routes.rb

match '/signout' => 'sessions#destroy', :via => :delete
Run Code Online (Sandbox Code Playgroud)

sessions_controller.rb

def destroy
  sign_out
  redirect_to root_path
end
Run Code Online (Sandbox Code Playgroud)

sessions_helper.rb

def sign_out
  current_user = nil
  cookies.delete(:remember_token)
end
Run Code Online (Sandbox Code Playgroud)

_header.html.erb

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

注销再次开始工作所需要的是从路由文件中删除":via =>:delete".这是正确的方法还是有更好的方法?此外,为什么链接在没有任何rails更新的情况下停止工作?

谢谢你,亚历山德拉

根据要求,我添加了_header.html.erb的完整代码:

完整_header.html.erb

<!-- ***** Initialized: Listing 5.24 ***** -->
<!-- ***** Updated: Listing 8.24 ***** -->
<!-- ***** Updated: Listing 9.7 ***** -->
<!-- ***** Begin: Listing 9.28 ***** -->
<header>
<header class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container">
      <% if signed_in? %>
        <%= link_to "project manager", about_path, id: "logo" %>
      <% else %>
        <%= link_to "project manager", root_path, id: "logo" %>
      <% end %>
      <nav>
        <ul class="nav pull-right">
          <!--li><%= link_to "Home", root_path %></li-->
          <% if signed_in? %>

<% if Rails.env.development? %>
            <li><%= link_to "Overview", overview_path %></li> 
<% end %>         
<% if Rails.env.development? %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Projects <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
              <li><%= link_to "Status", projects_path %></li>
              <li><%= link_to "Dev View", dev_projects_path %></li>
              </ul>
            </li>
<% else %>
          <li><%= link_to "Projects", projects_path %></li>
<% end %>
<% if Rails.env.development? %>
            <li><%= link_to "Teams", teams_path %></li> 
<% end %>
<% if Rails.env.development? %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Tasks <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
              <li><%= link_to "Status", tasks_status_path %></li>
              <li><%= link_to "Tree", tasks_tree_path %></li>
              <li><%= link_to "Dev View", dev_tasks_path %></li>
              </ul>
            </li>
<% else %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Tasks <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
              <li><%= link_to "Status View", tasks_status_path %></li>
              <li><%= link_to "Tree View", tasks_tree_path %></li>
              </ul>
            </li>
<% end %>

<% if Rails.env.development? %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Reports <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
              <li><%= link_to "Project Progress", analysis_path %></li>
              <li><%= link_to "Revision History", history_path %></li>
              </ul>
            </li>              
<% else %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Reports <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
              <li><%= link_to "Revision History", history_path %></li>
              </ul>
            </li>
<% end %>
<% if Rails.env.development? %>
            <li><%= link_to "Help", help_path %></li>
<% end %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Account <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
<% if current_user.admin? %>
                <li><%= link_to "Admin", users_path %></li> 
<% end %>
<% if Rails.env.development? %>
                <li><%= link_to "Profile", current_user %></li>
<% end %>
                <li><%= link_to "Settings", edit_user_path(current_user) %></li>
                <li class="divider"></li>
                <li>
                  <%= link_to "Sign out", signout_path, :method => :delete %>
                </li>
              </ul>
            </li>
          <% else %>
            <li><%= link_to "Sign in", signin_path %></li>
          <% end %>
        </ul>
      </nav>
    </div>
  </div>
</header>
<!-- ***** End: Listing 9.28 ***** -->
Run Code Online (Sandbox Code Playgroud)

小智 14

这个帖子有点旧,但我认为我会分享一个解决方案,因为更多的人可能会遇到同样的问题.

在进入实际故障排除之前,以下是一些有关其工作原理的背景信息:

请注意,"注销"链接如下所示:

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

如果查看此标记生成的源代码,您将看到:

<a href="/signout" data-method="delete" rel="nofollow">Sign out</a>
Run Code Online (Sandbox Code Playgroud)

请注意所说的部分data-method="delete".使用直接HTML,这将无法正常工作.如果单击该链接,浏览器将忽略DELETE指令,而是向服务器提交GET请求(这是您当前在日志中看到的内容).要让浏览器提交DELETE请求,您需要使用一些JavaScript魔法.这是jquery_ujs.js文件的来源(您很可能通过浏览器中的Viewing Source查看此文件的链接;它应位于头文件中,靠近或包含在application.js文件中) .如果查看jquery_ujs.js文件,在文件中间,您将看到以下代码:

// Handles "data-method" on links such as:
// <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>
Run Code Online (Sandbox Code Playgroud)

换句话说,上面的代码确保您的浏览器确实提交了DELETE请求(我们不必在此处了解实际代码的详细信息).

鉴于此背景信息,您可能会收到错误的原因有两个.

  1. 您只是缺少jquery_ujs.js文件

  2. 您编写或包含的其他JavaScript代码会干扰jquery_ujs.js文件的所需行为

要进行故障排除,请执行以下操作:

  1. 对于1)加载包含"注销"链接的页面,然后从浏览器中选择"查看源".确保文件jquery_ujs.js位于标题中(或者将其他JS文件连接到application.js文件中,具体取决于您的应用程序设置)

  2. 对于2)在application.js中,删除该//=require_tree .指令.重新加载您的页面,然后单击"注销"链接.如果Sign Out链接隐藏在仅适用于您安装的JavaScript的菜单下,那么只需在页面上的其他位置放置一个Sign Out链接的副本,即可在不使用JavaScript的情况下访问它.现在尝试点击链接 - 它应该有用.如果您不再收到路由错误,则表示这是导致问题的原因.解决这个问题的最简单方法是添加//=require_tree .指令,但是从它们所在的文件夹中删除除application.js文件之外的所有JavaScript文件,然后逐个添加每个文件,同时尝试使用Sign出链接,直到它不再有效.这将允许您识别troublemaker JavaScript文件.一旦你确定了这个文件,尝试删除所有代码(链接应该再次运行),然后添加代码片段,直到它不再有效 - 瞧,你现在已经确定了问题的根源!请随时报告它是什么.我的猜测是它可能是一个直接错误,一个return false;语句或一个stopPropagation();语句.

希望这会奏效!祝好运.


And*_*raD 3

由于我在 2012 年 9 月收到的答案没有解决我的问题,所以我最终从路由文件中删除了“:via => :delete”,这使得注销链接再次工作。

阅读埃里克林德的答案后,我回到我的代码,看看他的答案是否有帮助。jquery_ujs.js 文件没有丢失。因此,我开始研究建议的第二个可能的原因。尽管如此,当我转到routes.rb文件并添加“via: :delete”以使一行读取“match '/signout', :to => 'sessions#destroy', via: :delete”时,注销功能继续工作没有问题。由于"via: :delete"与我之前删除的":via => :delete"不同,也许这就是导致问题的原因?