Маршрутизация не работает, я получаю ошибку маршрутизации - PullRequest
1 голос
/ 04 декабря 2011

рейковых маршрутов:

        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>

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Задача «rake маршруты» показывает метод HTTP, на который она ответит, во втором столбце.В случае destroy_user_session_path, он отвечает только на метод DELETE HTTP.Это для безопасности, поскольку это разрушительное действие и отличается от запроса GET.В идеале веб-сканеры не будут следовать ссылкам DELETE из-за их потенциальной деструктивности.

Как утверждает Арун Кумар Арджунан, вам нужно будет явно указать, что эта ссылка должна выполняться с помощью метода 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

1 голос
/ 04 декабря 2011

Devise (по крайней мере, в текущей версии) не использует DELETE, он выполняет GET для своего пути destroy_user_session. Таким образом, чтобы выйти из системы, вашему представлению нужно только

link_to "logout", destroy_user_session_path

Твой маршрут.рб

  devise_for :users

Вот мои «маршруты рейка» для пользователя:

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"}
...