【问题标题】:Routing is not working, I get Routing error路由不起作用,我收到路由错误
【发布时间】:2011-12-04 02:46:59
【问题描述】:

耙路线:

        new_user_session GET    /users/sign_in(.:format)          {:action=>"new", :controller=>"devise/sessions"}
            user_session POST   /users/sign_in(.:format)          {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session DELETE /users/sign_out(.:format)         {:action=>"destroy", :controller=>"devise/sessions"}
           user_password POST   /users/password(.:format)         {:action=>"create", :controller=>"devise/passwords"}
       new_user_password GET    /users/password/new(.:format)     {:action=>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /users/password/edit(.:format)    {:action=>"edit", :controller=>"devise/passwords"}
                         PUT    /user  devise_for :userss/password(.:format)         {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET    /users/cancel(.:format)           {:action=>"cancel", :controller=>"devise/registrations"}
       user_registration POST   /users(.:format)                  {:action=>"create", :controller=>"devise/registrations"}
   new_user_registration GET    /users/sign_up(.:format)          {:action=>"new", :controller=>"devise/registrations"}
  edit_user_registration GET    /users/edit(.:format)             {:action=>"edit", :controller=>"devise/registrations"}
                         PUT    /users(.:format)                  {:action=>"update", :controller=>"devise/registrations"}
                         DELETE /users(.:format)                  {:action=>"destroy", :controller=>"devise/registrations"}
       user_confirmation POST   /users/confirmation(.:format)     {:action=>"create", :controller=>"devise/confirmations"}
   new_user_confirmation GET    /users/confirmation/new(.:format) {:action=>"new", :controller=>"devise/confirmations"}
                         GET    /users/confirmation(.:format)     {:action=>"show", :controller=>"devise/confirmations"}
              home_index GET    /home/index(.:format)             {:controller=>"home", :action=>"index"}
                    root        /                                 {:controller=>"home", :action=>"index"}

但是如果我点击注销链接,我会得到

Routing Error

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

这是application.html.erb:

<!DOCTYPE html>
<html>  devise_for :users
<head>
  <title>Rorblog</title>
  <%= stylesheet_link_tag    "application" %>
  <%#= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
</head>
<body>
<div id="container">

    <div id="header">

        <ul class="hmenu">
            <li>
                <%= link_to('Home', home_index_path ) %>
            </li>
            <% if user_signed_in? %>
              <li>
                <%= link_to('Logout', destroy_user_session_path, :method => :delete) %>
              </li>

              <li>
                <%= link_to('Edit registration', edit_user_registration_path) %>
              </li>

            <% else %>
              <li>
                <%= link_to('Login', new_user_session_path)  %>
              </li>
            <% end %>
        </ul>
        <p class="notice"><%= notice %></p>
        <p class="alert"><%= alert %></p>       
    </div>

    <div id="content">
        <div id="loadwhat">
            <%= yield %>
        </div>
    </div>

    <div id="footer">
        <%= "user1@copyright.com" %>
    </div>
</div>

</body>
</html>

从我得到的页面来源:

<a href="/users/sign_out" data-method="delete" rel="nofollow">Logout</a>

【问题讨论】:

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


    【解决方案1】:

    “rake routes”任务在第二列中显示了它将响应的 HTTP 方法。在destroy_user_session_path 的情况下,它只响应DELETE HTTP 方法。这是出于安全考虑,因为这是一种破坏性操作,与 GET 请求不同。理想情况下,网络爬虫不会跟踪 DELETE 链接,因为它们具有潜在的破坏性。

    正如 Arun Kumar Arjunan 所说,您需要明确指定此链接应使用 DELETE 方法执行。通过在链接中放置“:method => :delete”,Rails UJS 会将此链接转换为 DELETE 而不是 GET 请求,并遵循来自服务器的重定向。

    这里有更多关于 HTTP 方法的信息:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

    更多关于 Rails UJS 的信息在这里:https://github.com/rails/jquery-ujs/wiki/Unobtrusive-scripting-support-for-jQuery

    【讨论】:

    • Guru 似乎在他的“注销”链接中有 :method => :delete。大师 - 主页源中的链接是什么样的?
    • 如果Rails UJS 抓取它,它可能会显示为data-method="delete",并在点击时被Javascript 拦截。
    • 从页面源,我得到 注销
    • 不,我没有从工具>Web 开发人员>错误控制台中看到任何错误
    • 是的,gem 'jquery-rails' 在 Gemfile 中被注释了,我没有注释,现在看起来没问题。不明白为什么它依赖于 jquery-rails ?
    【解决方案2】:

    Devise(至少在当前版本中)不使用 DELETE,它为其“destroy_user_session”路径执行 GET。所以要注销,你的视图应该只需要一个

    link_to "logout", destroy_user_session_path
    

    你的路线.rb

      devise_for :users
    

    这是我为用户提供的“rake 路线”:

    new_user_session GET  /users/sign_in(.:format)  {:action=>"new", :controller =>"devise/sessions"}
    user_session POST   /users/sign_in(.:format)  {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session GET    /users/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
    

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 2017-09-25
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多