Нет подходящих маршрутов "/ 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 ]

3 голосов
/ 19 марта 2015

используйте :get и :delete метод для вашего пути:

devise_scope :user do
  match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
3 голосов
/ 24 марта 2014

Есть много решений. но в основном использую это,

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

или config devise.rb с правильным методом sign_out

В devise.rb

config.sign_out_via = :delete ( or  :get which u like to use.) 
3 голосов
/ 27 сентября 2011

Проблема начинается с rails 3.1 ... in /app/assets/javascript/, просто ищите application.js.

Если файл не существует, создайте файл с таким именем, я не знаю, почему мой файлисчезнуть или никогда не был создан на "rails new app"....

Этот файл является экземпляром для jquery....

2 голосов
/ 02 сентября 2011

Вот что я сделал (с Rails 3.0 и Devise 1.4.2):

  1. Убедитесь, что ваша страница загружается rails.js
  2. Используйте этот параметр: 'data-method' => 'delete'
  3. Хорошая идея добавить этот параметр:: rel => 'nofollow'
2 голосов
/ 29 сентября 2012

В вашем файле rout.rb:

 devise_for :users do
    get '/sign_out' => 'devise/sessions#destroy'
    get '/log_in' => 'devise/sessions#new'
    get '/log_out' => 'devise/sessions#destroy'
    get '/sign_up' => 'devise/registrations#new'
    get '/edit_profile' => 'devise/registrations#edit'
 end

и в вашем application.html.erb:

<%if user_signed_in?%>
          <li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>
1 голос
/ 04 февраля 2016

Я знаю, что это старый вопрос, основанный на Rails 3, но я столкнулся и решил его на Rails 4.0.4. Так что я подумал, как я могу исправить это для тех, кто столкнулся с этой проблемой в этой версии. Ваш пробег может отличаться, но вот что сработало для меня.

Сначала убедитесь, что у вас установлены гемы, и запустите пакетную установку.

gem 'jquery-rails'

gem 'turbolinks'

gem 'jquery-turbolinks'

В application.js проверьте, что все требуется, как показано ниже.

Осторожно, если этот гоча : это //= require jquery.turbolinks, а не //= require jquery-turbolinks

//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require_tree .

Затем добавьте соответствующие ссылки в заголовок application.html.erb.

<%= javascript_include_tag  "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>

Кажется, существует много вариантов реализации метода удаления, который, как я полагаю, зависит от версии Rails, которую вы используете. Это синтаксис delete, который я использовал.

<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>

Надеюсь, это поможет вырвать кого-то из этой очень расстраивающей дыры!

1 голос
/ 25 апреля 2013

':method => :delete 'на странице равно' data-method="delete" ' так что ваша страница должна иметь jquery_ujs.js, она отправит ссылку с методом delete, а не методом get

1 голос
/ 24 мая 2012

Посмотрите, есть ли у вашего route.rb «resource: users» перед «devise_for: users», затем попробуйте поменять их местами:

  1. Работает

    • devise_for: пользователи
    • ресурсы: пользователи
  2. Сбой

    • ресурсы: пользователи
    • devise_for: пользователи
0 голосов
/ 09 июня 2013

Обычно, когда вы получаете «Нет совпадений маршрутов», но думаете, что этот маршрут определен, тогда дважды проверяйте метод глагола / запроса http (будь то get, put, post, delete и т. Д.) Для этого маршрута .

Если вы запускаете рейковые маршруты, вы увидите ожидаемый метод и можете сравнить его с журналом запросов.

...