49 votes

Devise: Pourquoi mon lien de déconnexion ne fonctionne-t-il pas?

le problème: En un mot, lorsque j'essaie d'installer un lien de déconnexion de mon application, elle ne fonctionne pas. Voici contexte autant que je pense à le mettre ici (si vous voulez quelque chose d'autre, merci de poke moi)...

J'ai cela dans un haml vue:

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

Il génère cette vision:

<a href="http://stackoverflow.com/users/sign_out" data-method="delete" rel="nofollow">Logout</a>

J'ai vérifié que dans ma config/initializers/concevoir.rb j'ai ce paramètre décommenté et de corriger:

config.sign_out_via = :delete

J'ai validé le parcours suivant:

destroy_user_session DELETE /users/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}

J'ai aussi ce peu de ruse dans mes itinéraires.rb, et je suppose que c'est lié à mon problème:

devise_for :users, :controllers => {:sessions => "devise/sessions", :registrations => "users"}
resources :users

Ce dernier est parce que je veux gérer (modifier, créer et supprimer des utilisateurs dans mon propre contrôleur.

Le message d'erreur que j'obtiens est comme suit:

ActiveRecord::RecordNotFound in UsersController#show

Couldn't find User with ID=sign_out
Rails.root: /home/jaydel/projects/mbsquared-projects/Wilson-Goldrick

app/controllers/users_controller.rb:16:in `show'

Dans mes logs du serveur, je vois ce pour la requête:

Started GET "/users/sign_out" for 127.0.0.1 at 2011-08-04 13:08:51 -0500
  Processing by UsersController#show as HTML
  Parameters: {"id"=>"sign_out"}

N'importe qui ont des idées?

86voto

Jay Beale Points 635

La meilleure façon de résoudre ce problème, en termes de REST, serait de changer vos liens de déconnexion pour utiliser la méthode DELETE. C'est une solution très facile, qui change ceci:

 link_to "Log out", destroy_user_session_path
 

pour ça:

 link_to "Log out", destroy_user_session_path, :method => :delete 
 

33voto

ka8725 Points 1074

J'ai eu le même problème avec rails 3.2 lorsque j'ai supprimé à partir d' application.js cette ligne:

//= require jquery_ujs

Donc, je pense que vous devez insérer cette ligne dans votre application.js si vous n'avez pas encore là.

PS. Ce comportement signifie que les rails adaptateur jquery ne fonctionne pas. Donc, assurez-vous si il est chargé dans votre code html dans le navigateur. Vous devriez le tester en mode de développement, parce que vous aurez comprimé js en production et qu'il sera très difficile de trouver quelque chose.

19voto

Olives Points 3925

Le problème réside dans le fait que, dans vos journaux la signout requête est une requête GET.

Started GET "/users/sign_out"

Mais le signout route est un DELETE

destroy_user_session DELETE /users/sign_out(.:format) 

La raison pourquoi vous obtenez l'exception, c'est que c'est de se confondre avec l'un des itinéraires créés par resources :users qui serait quelque chose comme

edit_user GET /users/(:id)(.:format) {:action=>"edit", :controller=>"users"}

Fondamentalement, 'sign_out' est confondu avec un id.

Je ne sais pas pourquoi le lien de suppression ne va pas à travers comme une demande de SUPPRESSION. Si changement

config.sign_out_via = :delete

pour être :get pourrait résoudre le problème.

4voto

pws5068 Points 801

C'est une vieille question, mais la réponse acceptée n'est pas la bonne façon de résoudre ce problème (bien que ce soit un bon diagnostic du problème).

Quand j’ai rencontré ce problème aujourd’hui, mon fichier de routes est apparu comme suit:

   root :to => 'welcome#index' 

  resources :users    
  devise_for :users
 

Comme mentionné par Olives, la déclaration de ressources est simplement la cause de problèmes. J'avais simplement besoin d'inverser l'ordre de mes itinéraires ...

  root :to => 'welcome#index' 

  devise_for :users
  resources :users
 

4voto

Christoph Points 41

jQuery est requis pour pouvoir exécuter la requête avec DELETE. Assurez-vous de ne pas le laisser tomber de votre application.js.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X