Нет маршрутов совпадений "/users/sign_out" devise rails 3

Я установил приложение для своего приложения и применил следующее в моем файле 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"

Любые идеи, которые вызывают ошибку?

Ответ 1

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

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

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

Ответ 2

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

config.sign_out_via = :delete

к

config.sign_out_via = :get

и он начал работать для меня.

Ответ 3

Вероятно, вы не включили 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). Наконец, добавьте ссылку, как описано на Разработать wiki (haml-style):

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

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

Ответ 4

Возможность сделать ссылку "Выйти" вызовом DELETE 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 или не можете найти способ заставить его работать:

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

Ответ 5

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

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

Вид:

<%= link_to "Logout", logout_path %>

Ответ 6

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

devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
end

Ответ 7

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

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs

Ответ 8

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

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

изменения:

:delete

... to:

'delete'

Итак, код, который работал у меня:

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

Ответ 9

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

  • когда я расширяю маршруты:

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

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

    //= require jquery
    //= require jquery_ujs
    
  • и, конечно, та же самая ссылка, о которой говорилось выше:

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

Ответ 10

Добавить

  <%= csrf_meta_tag %>  and 
  <%= javascript_include_tag :defaults %>  to layouts

Используйте эти теги link_to

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

  or

 link_to 'Sign out', '/users/sign_out', :method => :delete

В маршрутах добавьте:

  devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end

Ответ 11

Другой вариант - настроить выход из системы как 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-sers-slash-sign- out.html) попытайтесь использовать DELETE из-за семантики этого метода.

Ответ 12

Если вы используете Rails 3.1, убедитесь, что ваш значок application.html.erb выглядит так:

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

И что ваша строка с поддержкой javascript выглядит следующим образом

<%= javascript_include_tag 'application' %>

Я предполагаю, что некоторые драгоценные камни перезаписывают новую структуру местоположения default.js.

Ответ 13

Проверьте это с исходным кодом в github:

https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (дата: 27 июня 2011 г.)

  • # Метод HTTP по умолчанию, используемый для выделения ресурса. По умолчанию: get. 188
  • # config.sign_out_via =: get 187
  • # Метод HTTP по умолчанию, используемый для выделения ресурса. По умолчанию: delete. 188
  • config.sign_out_via =: удалить

Ответ 14

Ну, ребята, для меня это только удалил: method = > : delete

<%= link_to('Sign out', destroy_user_session_path) %>

Ответ 15

Я хочу добавить к этому, даже если он немного стар.

ссылка "sign_out" не работает, несмотря на наличие метода: method = > : delete.

Комментарий, указывающий, что <%= javascript_include_tag :defaults %> должен быть включен, напомнил мне, что я недавно добавил JQuery java script и использовал простые теги <script src=""/> для их включения.

Когда я переместил их из следующих значений: по умолчанию до этого, sign_out снова начал работать.

Надеюсь, это поможет кому-то.

Ответ 16

Это означает, что вы не сгенерировали файлы jquery после установки jquery-rails gem. Поэтому сначала вам нужно сгенерировать его.

rails generate devise:install

Первый вариант:

Это означает, что вам нужно изменить следующую строку на /config/initializers/devise.rb

config.sign_out_via =: удалить в config.sign_out_via =: get

Второй вариант:

Вы только изменяете эту строку <%= link_to "Sign out", destroy_user_session_path %> на <%= link_to "Sign out", destroy_user_session_path, :method => :delete %> в файле вида.

Обычно :method => :delete не записывается по умолчанию.

Ответ 17

Не забудьте включить следующую строку в ваш application.js(Rails 3)

//= require_self
//= require jquery
//= require jquery_ujs

Включите jquery_ujs в мое приложение rails и теперь оно работает.

Ответ 18

Большинство ответов являются частичными. Я много раз сталкивался с этой проблемой. Необходимо решить две вещи:

<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>

необходимо указать метод удаления

Затем devise использует jquery, поэтому вам нужно загрузить эти

   <%= javascript_include_tag "myDirectiveJSfile" %> 

и убедитесь, что BOTH jQuery и jquery-ujs указаны в вашем myDirectiveJSfile.js

//= require jquery
//= require jquery_ujs

Ответ 19

Если вы используете HTTPS с приложением, он будет разорван, если ваша ссылка на выход будет в незащищенной версии. На задней панели он перенаправляется на защищенную версию. Это перенаправление - это GET, что вызывает проблему.

Убедитесь, что ваша ссылка использует HTTPS. Вы можете заставить его с помощью protocol: "https" в вашем помощнике URL (убедитесь, что вы используете помощник URL, а не помощник пути).

<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>

Ответ 20

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

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

Ответ 21

Проблема начинается с рельсов 3.1... в /app/assets/javascript/ просто найдите application.js.

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

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

Ответ 22

В ваших route.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 %>

Ответ 23

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

Ответ 24

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

<%= 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.) 

Ответ 25

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

devise_scope :user do
  match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end

Ответ 26

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

  • Работы

    • devise_for: users
    • ресурсы: пользователи
  • Не удается

    • ресурсы: пользователи
    • devise_for: users

Ответ 27

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

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

Ответ 28

  devise_for :users
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end

Ответ 29

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

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

gem 'jquery-rails'

gem 'turbolinks'

gem 'jquery-turbolinks'

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

Остерегайтесь, если это gotcha: it //= 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 %>

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

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

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