No route matches "/ пользователи / выйти из системы " devise rails 3

Я установил devise на мое приложение и применил следующее В моем :

<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 и подтвердил, что все маршруты являются допустимыми.

кроме того, в моем Я devise_for :users и root :to => "home#index".

Я получаю следующую ошибку маршрутизации при нажатии на ссылку "выйти":

No route matches "/users/sign_out"

есть идеи, что вызывает ошибку?

29 ответов


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

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

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


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

config.sign_out_via = :delete

to

config.sign_out_via = :get

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


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

rails generate jquery:install

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

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

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

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

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


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

однако, если у вас нет драгоценного камня jquery-ujs установлен или не вызывает результирующий javascript в вашем приложении.html через = javascript_include_tag "application", ответ будет отправлен как запрос GET,и маршрут не удастся.

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

  1. изменить config.sign_out_via равной :get внутри devise.rb (Не рекомендуется, так как DELETE является соответствующим RESTful запросом)
  2. или изменить link_to to = button_to('Logout', destroy_user_session_path, :method => :delete). С button_to Rails будет выполнять тяжелую работу при правильном вызове удаления. Тогда вы можете стиль кнопку выглядеть как ссылка, Если вы хотите.

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

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

вид:

<%= link_to "Logout", logout_path %>

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

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

используйте его в своих маршрутах.файл rb:

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

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

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

изменения:

:delete

... кому:

'delete'

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

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

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

  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 для "поддельного" запроса на удаление и отправляет его как GET. Поэтому вам нужно:

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

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

добавить:

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

другой вариант-настроить выход из системы как 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 из-за семантики этого метода.


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

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

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

<%= javascript_include_tag 'application' %>

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


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

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

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

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

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

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

rails generate devise:install

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

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

конфиг.sign_out_via =: удалить в config.sign_out_via =: get

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

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

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


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

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

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

когда я переместил их из После: defaults в before, sign_out снова начал работать.

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


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

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

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


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

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

метод delete должен быть указан

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

   <%= javascript_include_tag "myDirectiveJSfile" %> 

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

//= require jquery
//= require jquery_ujs

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

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

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

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

в ваши маршруты.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

и в приложении.формат html.Эрб:

<%if user_signed_in?%>
          <li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>

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

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

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


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

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

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


существует множество решений. но в основном используйте это,

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

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

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

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

  1. работает

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

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

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

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


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

сначала убедитесь, что у вас установлены драгоценные камни и запустите bundle install.

gem 'jquery-rails'

gem 'turbolinks'

gem 'jquery-turbolinks'

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

будьте осторожны, если это gotcha: это //= require jquery.turbolinks, а не //= require jquery-turbolinks

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

Далее добавьте соответствующие ссылки в заголовок приложения.формат html.Эрб.

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

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