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请求(我们不必在此处了解实际代码的详细信息).
鉴于此背景信息,您可能会收到错误的原因有两个.
您只是缺少jquery_ujs.js文件
您编写或包含的其他JavaScript代码会干扰jquery_ujs.js文件的所需行为
要进行故障排除,请执行以下操作:
对于1)加载包含"注销"链接的页面,然后从浏览器中选择"查看源".确保文件jquery_ujs.js位于标题中(或者将其他JS文件连接到application.js文件中,具体取决于您的应用程序设置)
对于2)在application.js中,删除该//=require_tree .指令.重新加载您的页面,然后单击"注销"链接.如果Sign Out链接隐藏在仅适用于您安装的JavaScript的菜单下,那么只需在页面上的其他位置放置一个Sign Out链接的副本,即可在不使用JavaScript的情况下访问它.现在尝试点击链接 - 它应该有用.如果您不再收到路由错误,则表示这是导致问题的原因.解决这个问题的最简单方法是添加//=require_tree .指令,但是从它们所在的文件夹中删除除application.js文件之外的所有JavaScript文件,然后逐个添加每个文件,同时尝试使用Sign出链接,直到它不再有效.这将允许您识别troublemaker JavaScript文件.一旦你确定了这个文件,尝试删除所有代码(链接应该再次运行),然后添加代码片段,直到它不再有效 - 瞧,你现在已经确定了问题的根源!请随时报告它是什么.我的猜测是它可能是一个直接错误,一个return false;语句或一个stopPropagation();语句.
希望这会奏效!祝好运.
由于我在 2012 年 9 月收到的答案没有解决我的问题,所以我最终从路由文件中删除了“:via => :delete”,这使得注销链接再次工作。
阅读埃里克林德的答案后,我回到我的代码,看看他的答案是否有帮助。jquery_ujs.js 文件没有丢失。因此,我开始研究建议的第二个可能的原因。尽管如此,当我转到routes.rb文件并添加“via: :delete”以使一行读取“match '/signout', :to => 'sessions#destroy', via: :delete”时,注销功能继续工作没有问题。由于"via: :delete"与我之前删除的":via => :delete"不同,也许这就是导致问题的原因?
| 归档时间: |
|
| 查看次数: |
3610 次 |
| 最近记录: |