2010-01-30 13 views
6

Ho installato un'autenticazione RESTFUL e tutto sembra funzionare correttamente. posso registrarmi e accedere. l'unico modo per eseguire il logout è digitando l'URL http://localhost:3000/logoutAggiungere un pulsante di disconnessione nell'autenticazione RESTFUL

come si aggiunge un pulsante di disconnessione su una pagina? Ho provato ad aggiungere uno alla members.rhtml

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

che fa riferimento al session_controller.rb ma ottengo un errore "Nessuna azione risposto a mostrare azioni:. creare, distruggere, e nuovi"

ogni pensiero ? thanx

risposta

7

Cosa hai nel tuo file di rotte?

provare a mettere

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

nei vostri percorsi.

Poi basta

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

per il collegamento cartello fuori.

EDIT

La sua tutta una questione di come si specifica l'instradamento.

Poiché hai avuto il map.log_out nel routing, allora l'url http://localhost:3000/logout url viene rilevato da questo e indirizzato all'azione corretta.

Se si dispone di:

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

Questo sarà solo generare un link per voi di http://localhost:3000/session. Ma non fa nulla per il routing. Devi ancora specificare i percorsi corretti.

Si noti che Rails non aggiunge l'azione destroy all'URL. (Non creerà http://localhost:3000/session/destroy.) Presuppone che se si ha un'azione di distruggere che lo si invierà con un verbo http DELETE. Per qualche ragione, non è proprio perfetto e in realtà non esegue l'invio del comando DELETE.

Si può costringerlo a fare questo:

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

Questo ancora non funziona a meno che anche percorso correttamente. Se mettete il seguente nelle vie:

map.resource :session 

Poi rotaie genererà il routing per tutti i verbi e specificare le azioni predefinite per loro, tra cui CANC. Ulteriori informazioni possono essere trovate qui: Rails Routing from the Outside In.

Tutta la pagina vale la pena di leggerla finché non la capisci davvero. Il routing è la chiave per capire Rails!

Per un semplice controller come Sessioni, è più semplice specificare la rotta log_out e quindi collegarsi a log_out_url ..

(Speranza che abbia un senso, la privazione del sonno si sta insinuando in!)

+0

mia routes.rb ha map.logout '/ logout',: controllore => 'sessioni',: action => 'distruggere ' – pixeltocode

+0

fantastico ... ha funzionato! ho usato <% = link_to "Esci", logout_url%> grazie – pixeltocode

+0

solo per curiosità ... non dovrebbe <% = link_to "logout",: controller => "sessioni",: azione => "destroy"%> funziona anche? fa riferimento alla def "destroy" in session_controller, che fa il "logout" – pixeltocode

0

Se si utilizza escogitare e il vostro modello in questione è utente, il modo elegante, è qui:

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

funziona perché:

  • a causa di metodi HTTP sono GET, POST, PUT, PATCH e DELETE, in modo da fissare utilizzando method: :delete (non method: :destroy come in questione)
  • che stiamo usando destroy_user_session_path con escogitare e utente modello come al solito, se si definisce altro nome del modello come Direttore basta cambiare percorso logout per destroy_manager_session_path
Problemi correlati