Нет подходящих маршрутов "/ users / sign_out" devise rails 3 - PullRequest
383 голосов
/ 02 июля 2011

Я установил devise в своем приложении и применил в моем файле application.html.erb следующее:

<div id="user_nav">
    <% if user_signed_in? %>
        Signed in as <%= current_user.email %>. This cannot be cheese?
        <%= link_to 'Sign out', destroy_user_session_path %>
    <% else %>
        <%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %>
    <% end %>
</div>

Я запустил rake routes и подтвердил, что все маршруты действительны.

Кроме того, в моем файле routes.rb есть devise_for :users и root :to => "home#index".

При нажатии ссылки «Выйти» появляется следующая ошибка маршрутизации:

No route matches "/users/sign_out"

Есть идеи, что является причиной ошибки?

Ответы [ 29 ]

563 голосов
/ 02 июля 2011

Я думаю, что маршрут для выхода из системы - DELETE метод.Это означает, что ваша ссылка для выхода должна выглядеть следующим образом:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

Ваша не включает в себя часть :method => :delete.Кроме того, обратите внимание, что для этого необходимо включить <%= javascript_include_tag :defaults %> в файл макета (application.html.erb).

131 голосов
/ 12 июля 2011

Я изменил эту строку в devise.rb:

config.sign_out_via = :delete

до

config.sign_out_via = :get

и у меня это заработало.

60 голосов
/ 07 июля 2011

Возможно, вы не включили javascript файл jquery_ujs Убедитесь, что вы используете последнюю версию jquery-ujs: https://github.com/rails/jquery-ujs и последние доступные файлы:

rails generate jquery:install

Вы должны , а не иметь больше файл rails.js. Если вы это сделаете, вы, вероятно, устарели. Также убедитесь, что этот файл загружен с настройками по умолчанию, в config / application.rb

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)

(Опять же, вы не должны иметь файл rails.js здесь). Наконец, добавьте ссылку, как описано в Devise wiki (haml-style):

= link_to('Logout', destroy_user_session_path, :method => 'delete')

И все будет хорошо.

31 голосов
/ 01 октября 2012

Чтобы сделать ссылку выхода из системы удаленным вызовом RESTful, требуется html-атрибут data-method = "delete" с использованием кода rails = link_to('Logout', destroy_user_session_path, :method => :delete).

Однако, если у вас не установлен gem jquery-ujs или вы не вызываете полученный javascript в вашем application.html через = javascript_include_tag "application", ответ будет отправлен как GET-запрос, и маршрут будетошибка.

У вас есть несколько вариантов, если вы не хотите использовать jquery-ujs или не можете найти способ заставить его работать:

  1. Измените config.sign_out_via на :get в пределах devise.rb (не рекомендуется, поскольку DELETE - это соответствующий запрос RESTful)
  2. ИЛИ Измените link_to на = button_to('Logout', destroy_user_session_path, :method => :delete)button_to Rails сделает тяжелую работу при правильном вызове DELETE.Затем вы можете придать стили кнопке вид ссылки, если хотите.
24 голосов
/ 02 июля 2011

Попробуйте добавить новый маршрут для devise / session # destroy и создать ссылку на него.Например:

routes.rb
devise_for :users do
  get 'logout' => 'devise/sessions#destroy'
end

просмотр:

<%= link_to "Logout", logout_path %>
13 голосов
/ 02 сентября 2011

У меня была такая же проблема с рельсами 3.1.0, и я решил добавить в файл следующие строки:

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
13 голосов
/ 30 марта 2012

Используйте его в вашем файле rout.rb:

devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
end
10 голосов
/ 11 июля 2011

За одним исключением, у меня сработал ответ Джесси:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

изменить:

:delete

... на:

'delete'

Итак, кодэто работает для меня это:

<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
9 голосов
/ 22 марта 2013

Много ответов уже на вопрос.Для меня проблема была в два раза:

  1. , когда я расширяю свои маршруты:

    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  2. Я получал предупреждение, что это амортизируется, поэтомуЯ заменил его на:

    devise_scope :users do
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  3. Я думал, что удалю свой jQuery.Плохой выбор.Devise использует jQuery для "подделки" запроса DELETE и отправки его как GET.Поэтому вам необходимо:

    //= require jquery
    //= require jquery_ujs
    
  4. и, конечно, та же ссылка, что и многие упомянутые ранее:

    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
    
7 голосов
/ 18 декабря 2011

Другой вариант - настроить выход из GET вместо DELETE, вы можете сделать это, добавив следующую строку в /config/initializers/devise.rb

config.sign_out_via = :get

Но, как Стив Клабник написал в своем блоге (http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html) попробуйте использовать DELETE из-за семантики этого метода.

...