Нет совпадений маршрута [GET] "/users/sign_out"
Вот моя фактическая ошибка: No route matches [GET] "/members/sign_out"
Поскольку большинство людей будут использовать "пользователей", я подумал, что было бы более полезно иметь это в названии. Во всяком случае, я не могу выйти из системы. Я могу успешно редактировать профиль моего члена.
Я использую devise 1.4.2 и Rails 3.1.0.rc4. Кроме того, я создал две отдельные модели разработки - один из них называется "члены", а другой - "админы". Я смог зарегистрироваться и войти в оба из них (одновременно), вручную перейдя по правильному пути URL (т.е. Localhost: 3000/admins/sign_in/). Я создал некоторые ссылки в моем файле layout.html.haml, следуя этому RailsCast on Devise. Я знаю, что он только обращается к ссылкам signin/signout для "members".
Если я нажимаю на ссылку с выводом, я получаю вышеуказанную ошибку. Это происходит, если я вручную перейду к любому URL-адресу (т.е. Localhost: 3000/admins/sign_out/).
Может кто-нибудь сказать мне, почему это происходит? Ниже приведены различные связанные файлы. И, конечно же, я новичок...
вывод рейковых маршрутов:
j(film_repo)$ rake routes
new_member_session GET /members/sign_in(.:format) {:action=>"new", :controller=>"devise/sessions"}
member_session POST /members/sign_in(.:format) {:action=>"create", :controller=>"devise/sessions"}
destroy_member_session DELETE /members/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
member_password POST /members/password(.:format) {:action=>"create", :controller=>"devise/passwords"}
new_member_password GET /members/password/new(.:format) {:action=>"new", :controller=>"devise/passwords"}
edit_member_password GET /members/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
PUT /members/password(.:format) {:action=>"update", :controller=>"devise/passwords"}
cancel_member_registration GET /members/cancel(.:format) {:action=>"cancel", :controller=>"devise/registrations"}
member_registration POST /members(.:format) {:action=>"create", :controller=>"devise/registrations"}
new_member_registration GET /members/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"}
edit_member_registration GET /members/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"}
PUT /members(.:format) {:action=>"update", :controller=>"devise/registrations"}
DELETE /members(.:format) {:action=>"destroy", :controller=>"devise/registrations"}
new_admin_session GET /admins/sign_in(.:format) {:action=>"new", :controller=>"devise/sessions"}
admin_session POST /admins/sign_in(.:format) {:action=>"create", :controller=>"devise/sessions"}
destroy_admin_session DELETE /admins/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
admin_password POST /admins/password(.:format) {:action=>"create", :controller=>"devise/passwords"}
new_admin_password GET /admins/password/new(.:format) {:action=>"new", :controller=>"devise/passwords"}
edit_admin_password GET /admins/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
PUT /admins/password(.:format) {:action=>"update", :controller=>"devise/passwords"}
cancel_admin_registration GET /admins/cancel(.:format) {:action=>"cancel", :controller=>"devise/registrations"}
admin_registration POST /admins(.:format) {:action=>"create", :controller=>"devise/registrations"}
new_admin_registration GET /admins/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"}
edit_admin_registration GET /admins/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"}
PUT /admins(.:format) {:action=>"update", :controller=>"devise/registrations"}
DELETE /admins(.:format) {:action=>"destroy", :controller=>"devise/registrations"}
films GET /films(.:format) {:action=>"index", :controller=>"films"}
POST /films(.:format) {:action=>"create", :controller=>"films"}
new_film GET /films/new(.:format) {:action=>"new", :controller=>"films"}
edit_film GET /films/:id/edit(.:format) {:action=>"edit", :controller=>"films"}
film GET /films/:id(.:format) {:action=>"show", :controller=>"films"}
PUT /films/:id(.:format) {:action=>"update", :controller=>"films"}
DELETE /films/:id(.:format) {:action=>"destroy", :controller=>"films"}
root / {:controller=>"films", :action=>"index"}
routes.rb
FilmRepo::Application.routes.draw do
devise_for :members
devise_for :admins
resources :films
root :to => 'films#index'
end
admin.rb(модель)
class Admin < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :confirmable, :lockable, and :omniauthable
devise :database_authenticatable, :registerable, :timeoutable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me
end
member.rb(модель)
class Member < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me
end
application.html.haml
!!!
%html
%head
%title Film Repo
= stylesheet_link_tag 'compiled/screen.css', :media => 'screen, projection'
= stylesheet_link_tag 'compiled/print.css', :media => 'print'
/[if lt IE 8]
= stylesheet_link_tag 'compiled/ie.css', :media => 'screen, projection'
= csrf_meta_tag
%body.bp
#container
#user_nav
- if member_signed_in?
Signed in as #{current_member.email}. Not you?
\#{link_to "Sign out", destroy_member_session_path}
- else
= link_to "Sign up", new_member_registration_path
or #{link_to "sign in", new_member_session_path}
- flash.each do |name, msg|
= content_tag :div, msg, :id => "flash_#{name}"
= yield
Ответы
Ответ 1
У меня была аналогичная проблема, но добавление метода: method = > : delete не сработало.
Я смог добавить новый маршрут для запроса на получение, комментируя пользователей devise_for: и добавляя
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
Ответ 2
Вы можете завершить сеанс через get, изменив конфигурацию разработки в инициализаторах.
# The default HTTP method used to sign out a resource. Default is :delete.
config.sign_out_via = :get
Просто откройте ссылку и ваш сеанс будет удален.
Ответ 3
Хотя я не знаю причину, причина, по которой вы получаете это сообщение, состоит в том, что на ваших маршрутах у вас есть
destroy_member_session DELETE /members/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
Это означает, что маршрут доступен только с помощью метода DELETE, а не GET. Это немного странно, поскольку в документах для разработки говорится, что он должен создать его как маршрут GET (https://github.com/plataformatec/devise/blob/master/lib/devise/rails/routes.rb#L30)
С его помощью в качестве маршрута DELETE вы можете выйти из системы, используя
link_to :logout, destroy_member_session_path, :method => :delete
Ответ 4
Мне просто нужно было добавить
//= require jquery
//= require jquery_ujs
на мой application.js
Ответ 5
У меня была аналогичная проблема.
Мой код выглядит так:
<%= link_to " exit", destroy_user_session_path, method: :delete %>
После добавления следующего изменения в route.rb он работал,
devise_for :users
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end
Ответ 6
Мы по-прежнему можем использовать :method => :delete
в моем коде, например
= link_to "Sign out", destroy_user_session_path,:method => :delete
Причина, по которой я не могу загрузить javascript, который включает jquery, убедитесь, что
= javascript_include_tag "application" (haml- you can use html too)
включить jquery-ui и jquery-ujs. Поэтому, если все еще ошибка, я предлагаю изменить рельсы gem в GEMFILE до версии 3.2.6 и вызвать bundle update
для обновления драгоценных камней. Это работает для меня!
Ответ 7
= link_to "Sign out", destroy_user_session_path,:method => :delete
будет работать НЕ,
= link_to "Sign out", destroy_user_session_path,:method => 'delete'
должен сделать трюк или худший случай добавить jquery_ujs в application.js
Ответ 8
В devise.rb измените
config.sign_out_via = :delete
к
config.sign_out_via = :get
Это сработало для меня. Я сошел с ума от этого, потому что по умолчанию это delete
, и я не понимаю, почему.
Это работает, но я не уверен, влияет ли это на другие элементы приложения.
Ответ 9
Используя Rails4, мне пришлось использовать следующий метод:
<%= link_to "Logout", destroy_admin_session_path, method: :delete %>
Акцент на том, где находятся двоеточия: и: delete
Ответ 10
Может быть, это поможет кому-то.
Обновлен с Rails 3.0 до 3.1 и нашел эту проблему.
Это исправило это для меня:
routes.rb:
devise_for: users
devise.rb:
config.sign_out_via =: удалить
application.html.erb:
<%= javascript_include_tag "application" %>
* not: defaults
_login_items.html.erb:
<%= link_to('Logout', destroy_user_session_path, :method => :delete) %>
app/assets/javascripts/application.js
//= require jquery
//= require jquery-ui
//= require jquery_ujs
//= require_tree .
и у меня в javascript/jquery.js, jquery_ujs.js из версии 3.0, которую я удалил.
Ответ 11
Возможно, вы удалили активы /javascripts/ *
Запустите rails generate jquery:install --ui
, это сгенерирует все javascripts, как показано ниже.
[email protected]:~/Projects/Rails_apps/rtest$ rails generate jquery:install --ui
remove public/javascripts/prototype.js
remove public/javascripts/effects.js
remove public/javascripts/dragdrop.js
remove public/javascripts/controls.js
copying jQuery (1.7.1)
create public/javascripts/jquery.js
create public/javascripts/jquery.min.js
copying jQuery UI (1.8.16)
create public/javascripts/jquery-ui.js
create public/javascripts/jquery-ui.min.js
copying jQuery UJS adapter (822920)
remove public/javascripts/rails.js
create public/javascripts/jquery_ujs.js
Перейдите в свой макет, например application.html.erb, и отредактируйте <%= javascript_include_tag :all %>
Это сработало для меня:)
Ответ 12
Проблема начинается с рельсов 3.1 в assets/javascript/
. Просто найдите application.js
, и если файл не существует, создайте файл с этим именем. Я не знаю, почему мой файл исчезает или никогда не был создан в новом приложении rails... этот файл является экземпляром для jquery.
Ответ 13
FWIW Я также столкнулся с этой проблемой. Изучили все предложенные ответы, однако единственное, что работало, это foto open routes.rb и прокомментировать следующую строку:
devise_for :users
Ниже, добавьте следующую строку:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
Ответ 14
@creamhost сказать,
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
но это неправильное решение для меня (Rails4). Я решил нашу проблему (ответ @Olives),
link_to :logout, destroy_member_session_path, method: :delete
Ответ 15
Просто используйте следующую ссылку для выхода:
<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
Ответ 16
//= require jquery_ujs
Вам не хватает этой строки в ваших активах. Нет необходимости получать запрос /users/signout
. Поместите эту строку в файл JavaScript на самой верхней части страницы.
Ответ 17
Имел ту же проблему и помнил, что это только начиналось, когда я решил "очистить" мои файлы Javascript. Поэтому я снова побежал rails generate jquery:install --ui
, и это решило это для меня. (Вы можете игнорировать часть -ui, если вам не нужен пользовательский интерфейс JQuery, я полагаю.)
Ответ 18
Я получал ту же ошибку, что и OP для /users/sign _out, потому что я использовал ее вместо DELETING (я тоже являюсь разработчиком 1-го года). После проверки github через этот ответ я отправил запрос на перенос, чтобы исправить его!
https://github.com/plataformatec/devise/pull/2040
Go S.O.!!!
Ответ 19
Это происходит только на окнах.. Добавьте в файл Application.html.erb следующее:
devise_for: users
devise_scope: пользователь do
get '/users/sign_out' = > 'devise/sessions # destroy'
конец