2010-01-30 13 views
6

J'ai installé l'authentification RESTFUL et tout semble fonctionner correctement. Je peux m'inscrire et me connecter. la seule façon dont je peux me déconnecter est en tapant l'URL http://localhost:3000/logoutAjout d'un bouton de déconnexion dans l'authentification RESTFUL

comment ajouter un bouton de déconnexion sur une page? J'ai essayé d'ajouter un à l'members.rhtml

<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %> 

qui fait référence à la session_controller.rb mais je reçois une erreur « Aucune action répondu à montrer actions:. créer, détruire, et de nouveaux »

toute pensée ? thanx

Répondre

7

Qu'avez-vous dans votre fichier de routes?

Essayez de mettre

map.log_out 'logout', :controller => 'sessions', :action => 'destroy' 

dans vos itinéraires.

Ensuite, il suffit ont

<%= link_to "Sign out", log_out_url %> 

pour le signe en lien.

EDIT

Son tout à la façon dont vous spécifiez le routage.

Parce que vous aviez le map.log_out dans le routage, alors l'URL http://localhost:3000/logout est ramassée par ceci et routée vers l'action correcte.

Si vous avez:

<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %> 

Cela vient de générer un lien pour vous de http://localhost:3000/session. Mais, cela ne fait rien au routage. Vous devez toujours spécifier les itinéraires corrects.

Notez que Rails n'ajoute pas l'action destroy à l'URL. (Il ne créera pas http://localhost:3000/session/destroy.) Il suppose que si vous avez une action de détruire que vous l'enverrez avec un verbe DELETE http. Pour une raison quelconque, ce n'est pas tout à fait parfait et il ne fait pas aussi défaut d'envoyer le verbe DELETE.

Vous pouvez le forcer à le faire:

<%= link_to "logout", {:controller=> "user_sessions", :action=> "destroy"}, :method => :delete%> 

Cela fonctionne toujours pas à moins que vous aussi la route correctement. Si vous mettez ce qui suit dans les routes:

map.resource :session 

Ensuite rails va générer le routage pour tous les verbes et spécifier les actions par défaut pour eux, y compris SUPPR. Plus d'informations peuvent être trouvées ici: Rails Routing from the Outside In.

Cette page entière vaut la peine d'être lue encore et encore jusqu'à ce que vous la compreniez vraiment. Le routage est la clé pour comprendre Rails!

Pour un contrôleur simple comme Sessions, il est plus simple de spécifier l'itinéraire log_out, puis de lier à log_out_url ..

(espoir qui fait sens, la privation de sommeil est rampante dans!)

+0

mon routes.rb a map.logout '/ fermeture de session',: controller => 'sessions',: action => « détruire ' – pixeltocode

+0

génial ... qui a fonctionné! j'ai utilisé <% = link_to "Déconnexion", logout_url%> merci – pixeltocode

+0

juste par curiosité ... ne devrait pas <% = link_to "se déconnecter",: controller => "sessions",: action => "détruire"%> fonctionne aussi? c'est référencer le 'def' def dans session_controller, qui fait la 'déconnexion' – pixeltocode

0

Si vous utilisez DEVISE et votre modèle concerné est utilisateur, la façon élégante est ici:

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

Cela fonctionne parce que:

  • en raison de méthodes HTTP sont GET, POST, PUT, PATCH et DELETE, donc la fixation à l'aide method: :delete (non method: :destroy comme question)
  • nous utilisons destroy_user_session_path avec DEVISE et utilisateur modèle comme d'habitude, si vous définissez un autre nom de modèle tel que directeur que vous venez de changer de chemin pour destroy_manager_session_path
  • fermeture de session