Aucun itinéraire ne correspond [GET] " / utilisateurs / déconnexion"
Voici mon erreur réelle: No route matches [GET] "/members/sign_out"
Puisque la plupart des gens vont utiliser les "utilisateurs" j'ai pensé qu'il serait plus utile que dans le titre. En tout cas, je suis essentiel incapable de me déconnecter. Je peux modifier avec succès mon profil de membre.
J'utilise devise 1.4.2 et Rails 3.1.0.rc4. En outre, j'ai généré deux modèles de devise distincts-l'un appelé " membres "et l'autre appelé"admins". J'ai pu m'inscrire et me connecter aux deux (simultanément) en naviguant manuellement vers le bon chemin D'URL (c'est à dire, localhost:3000/admins/sign_in/). J'ai créé quelques liens dans mon application.HTML.fichier de mise en page haml en suivant ce RailsCast sur Devise . Je suis conscient qu'il ne s'adresse qu'aux liens signin / signout pour les "membres"."
Si je clique sur le lien de déconnexion, j'obtiens l'erreur ci-dessus. Cela se produit si je navigue manuellement vers L'une ou l'autre URL de déconnexion (c'est-à-dire, localhost:3000/admins/sign_out/).
Quelqu'un peut-il me dire pourquoi cela se produit? Voici les différents fichiers connexes. Et bien sûr, je suis novice...
Sortie des routes de râteau:
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 (modèle)
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
Membre.rb (modèle)
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
19 réponses
J'ai eu un problème similaire, mais l'ajout de :method=>: delete n'a pas fonctionné. J'ai pu ajouter une nouvelle route pour une requête get en commentant devise_for: users et en ajoutant
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
Vous pouvez terminer une session via get en modifiant la configuration devise dans les initialiseurs.
# The default HTTP method used to sign out a resource. Default is :delete.
config.sign_out_via = :get
Il suffit d'ouvrir le lien et votre session est supprimée.
Bien que je ne connaisse pas la cause, la raison pour laquelle vous recevez ce message est que dans vos itinéraires vous avez
destroy_member_session DELETE /members/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
Ce qui signifie que la route n'est disponible qu'avec la méthode DELETE par opposition à GET. C'est un peu bizarre car dans les docs for devise il est dit qu'il devrait le créer comme GET route (https://github.com/plataformatec/devise/blob/master/lib/devise/rails/routes.rb#L30)
Avec comme route de suppression, Vous devriez pouvoir vous déconnecter en utilisant
link_to :logout, destroy_member_session_path, :method => :delete
J'ai eu un problème similaire. Mon code de vue était comme ceci:
<%= link_to " exit", destroy_user_session_path, method: :delete %>
Après avoir ajouté la modification suivante aux routes.rb ça a marché,
devise_for :users
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end
J'avais juste besoin d'ajouter le
//= require jquery
//= require jquery_ujs
À mon application.js
On peut toujours utiliser :method => :delete
dans mon code, comme ça
= link_to "Sign out", destroy_user_session_path,:method => :delete
La raison pour laquelle je pense que nous ne parvenons pas à charger javascript qui inclut jquery, assurez-vous que
= javascript_include_tag "application" (haml- you can use html too)
Pour inclure jquery ui et jquery-ujs. Donc, si c'est toujours une erreur, je suggère de changer rails gem dans GEMFILE à la version 3.2.6 et d'appeler bundle update
pour mettre à jour les gemmes. Il fonctionne pour moi!
= link_to "Sign out", destroy_user_session_path,:method => :delete
NE FONCTIONNERA PAS à la place Utilisez ceci,
= link_to "Sign out", destroy_user_session_path,:method => 'delete'
Devrait faire l'affaire ou pour le pire cas, ajoutez exiger jquery_ujs votre application.js
En concevoir.rb, le changement
config.sign_out_via = :delete
À
config.sign_out_via = :get
Cela a fonctionné pour moi. Je suis devenu fou avec cela parce que la valeur par défaut est delete
et je ne comprends pas pourquoi.
Cela fonctionne, mais je ne suis pas sûr si cela affecte d'autres éléments de l'application.
En utilisant Rails4, j'ai dû utiliser la méthode suivante:
<%= link_to "Logout", destroy_admin_session_path, method: :delete %>
Accent sur l'endroit où les deux points sont sur la méthode: et :supprimer
Peut être que cela aidera quelqu'un. Mis à niveau de Rails 3.0 à 3.1 et trouvé ce problème. Cela l'a corrigé pour moi:
Routes.rb:
devise_for: utilisateurs
Concevoir.rb:
config.sign_out_via =: Supprimer
Application.HTML.erb:
<%= javascript_include_tag "application" %>
* non: valeurs par défaut
_login_items.HTML.erb:
<%= link_to('Logout', destroy_user_session_path, :method => :delete) %>
App/assets/javascripts/de l'application.js
//= require jquery
//= require jquery-ui
//= require jquery_ujs
//= require_tree .
Et j'avais en javascript / jquery.js, jquery_ujs.js partir de la version 3.0 que j'ai supprimé.
Vous avez peut-être supprimé assets / javascripts/ *
Exécuter {[1] } cela va générer tous les javascripts comme indiqué ci-dessous
xxxx@xxxxx:~/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
Accédez à votre mise en page par exemple application.HTML.erb et modifier <%= javascript_include_tag :all %>
Cela a fonctionné pour moi:)
FWIW j'ai aussi rencontré ce problème. Ont examiné toutes les réponses suggérées mais le seul qui a fonctionné était de foto routes ouvertes.rb et commenter la ligne suivante:
devise_for :users
En dessous, ajouter la ligne suivante:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
, Le problème commence avec rails 3.1 assets/javascript/
. Il suffit de chercher application.js
, et si le fichier n'existe pas, créez un fichier avec ce nom. Je ne sais pas pourquoi mon fichier disparaît ou n'a jamais été créé sur rails nouvelle application... ce fichier est l'instance pour jquery.
@ creamhost dire,
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
Mais ce n'est pas une solution correcte pour moi (Rails4). J'ai résolu notre problème (Réponse de@Olives),
link_to :logout, destroy_member_session_path, method: :delete
Utilisez simplement ce qui suit pour votre lien de déconnexion:
<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
//= require jquery_ujs
Vous manquez cette ligne dans vos actifs. Il n'y a pas besoin d'obtenir la requête /users/signout
. Mettez cette ligne dans le fichier JavaScript tout en haut de la page.
A eu le même problème et s'est souvenu qu'il n'a commencé à se produire qu'après avoir décidé de "nettoyer" mes fichiers Javascript. J'ai donc couru rails generate jquery:install --ui
à nouveau et cela l'a résolu pour moi. (Vous pouvez ignorer la partie --ui si vous n'avez pas besoin de L'interface utilisateur JQuery, je suppose.)
Je recevais la même erreur que L'OP avait pour / users / sign_out parce que je L'obtenais au lieu de le supprimer (je suis aussi un développeur de 1ère année). Après avoir vérifié github via cette réponse, j'ai soumis la demande de tirage pour la corriger!
Https://github.com/plataformatec/devise/pull/2040
Aller S. O. !!!
Cela n'arrive que sur windows.. Ajouter la chose suivante à votre Demande.HTML.dossier erb.
Devise_for: utilisateurs
Devise_scope :l'utilisateur ne
get '/users/sign_out' => 'concevoir/les sessions#détruire'
fin