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
или не может найти способ сделать это работа:
- изменить
config.sign_out_via
равной:get
внутриdevise.rb
(Не рекомендуется, так как DELETE является соответствующим RESTful запросом) - или изменить
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' %>
многие ответы на вопросы. Для меня проблема была в два раза:
-
когда я расширяю свои маршруты:
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 для "поддельного" запроса на удаление и отправляет его как GET. Поэтому вам нужно:
//= require jquery //= require jquery_ujs
-
и конечно же ссылка как и многие упомянутые ранее:
<%= 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 %>
в ваши маршруты.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):
- убедитесь, что ваша страница загружается рельсы.js
- используйте этот параметр: 'data-method' = > 'delete'
- хорошая идея добавить этот 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", затем попробуйте поменять их местами:
-
работает
- devise_for :пользователи
- ресурсы :пользователи
-
Не
- ресурсы :пользователи
- 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>
надеюсь, что это поможет выкопать кого-то из этой очень разочаровывающей ямы!