2010-01-30 14 views
6

He instalado la autenticación RESTFUL y todo parece funcionar bien. puedo iniciar sesión e iniciar sesión la única forma en que puedo cerrar la sesión es escribiendo la URL http://localhost:3000/logoutAgregue un botón de cerrar sesión en la autenticación RESTFUL

¿cómo agrego un botón para cerrar sesión en una página? He intentado añadir una a la members.rhtml

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

que hace referencia al session_controller.rb pero me da un error "Ninguna acción respondieron a mostrar acciones:. crean, destruyen, y nuevos"

cualquier pensamiento ? thanx

Respuesta

7

¿Qué tienes en tu archivo de rutas?

trate de poner

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

en sus rutas.

A continuación, sólo tienen

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

para el enlace Cerrar sesión.

EDITAR

Su todo se debe a la forma de especificar la ruta.

Como tenía el map.log_out en el enrutamiento, la URL url http://localhost:3000/logout se recoge y se enruta a la acción correcta.

Si usted tiene:

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

Esto sólo va a generar un enlace para usted de http://localhost:3000/session. Pero no le hace nada al enrutamiento. Aún necesita especificar las rutas correctas.

Tenga en cuenta que Rails no agrega la acción de destrucción a la url. (No creará http://localhost:3000/session/destroy.) Supone que si tiene una acción de destruir que lo va a enviar con un verbo DELETE http. Por alguna razón, no es del todo perfecto y tampoco envía el verbo DELETE.

Puede forzarlo a hacer esto:

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

Esto todavía no funcionará a menos que también ruta correctamente. Si ponemos la siguiente en las rutas:

map.resource :session 

Entonces rieles generará el enrutamiento para todos los verbos y especificar las acciones predeterminadas para ellos, incluyendo BORRAR. Puede encontrar más información aquí: Rails Routing from the Outside In.

Esa página entera vale la pena leer una y otra vez hasta que realmente la entiendas. ¡El enrutamiento es clave para entender Rails!

Para un controlador simple como Sessions, es más fácil simplemente especificar la ruta log_out y luego enlazar con log_out_url ..

(Hope que tenga sentido, la privación del sueño se está arrastrando en!)

+0

mi routes.rb tiene map.logout '/ cierre de sesión',: controller => 'sesiones',: action => 'destruir ' – pixeltocode

+0

increíble ... ¡funcionó! utilicé <% = link_to "Cerrar sesión", logout_url%> gracias – pixeltocode

+0

solo por curiosidad ... no debería <% = link_to "logout",: controller => "sessions",: action => "destroy"%> ¿también funciona? se está refiriendo a la def 'destruir' en session_controller, que hace que 'logout' – pixeltocode

0

Si está utilizando idear y su modelo en cuestión es usuario, la manera elegante está aquí:

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

funciona porque:

  • debido a los métodos HTTP GET son, POST, PUT, DELETE parche y, por lo que se fija mediante el uso de method: :delete (no method: :destroy que en la pregunta)
  • estamos utilizando destroy_user_session_path con idear y usuario modelo como de costumbre, si definir otro nombre del modelo, como el Administrador de que acaba de cambiar la ruta de cierre de sesión a destroy_manager_session_path
Cuestiones relacionadas