2012-03-06 54 views
6

Estoy un poco confundido acerca de cómo es el diseño de enrutar mis solicitudes, por alguna razón no puedo ir a la ruta de cierre de sesión en mi aplicación ahora:Devise/Rails: No coincide la ruta [GET] "/ users/sign_out"

ActionController::RoutingError (No route matches [GET] "https://stackoverflow.com/users/sign_out") 

Esto es lo que mis rutas relacionadas con mi modelo de usuario y trazo se parecen:

devise_for :users, :controllers => {:registrations => "registrations"} 
devise_scope :user do 
    get '/settings' => 'registrations#edit' 
end 

¿Podría definir ese alcance evitar que mis otras rutas de trabajar así?

actualización

No creo que se supone que debe ser GET solicitud, como mi enlace se parece a:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %> 
+0

Debe ser una solicitud DELETE. ¿Qué pasaría si dejara devise_for: usuarios en sus rutas? – gtr32x

+1

¿Tu javascript arroja algún error? En realidad, es el javascript discreto que hará que esto sea una llamada HTTP DELETE. –

+0

¿Qué tiene su archivo de configuración de Devise para el siguiente elemento: '' 'config.sign_out_via''' –

Respuesta

14

Si intenta ir a/usuarios/sign_out escribiéndola en la barra de direcciones del navegador, o vincular a ella normalmente, obtendrá este error. Para resumir algunos comentarios y respuestas aquí y de problemas en el repositorio de diseño en github:

Esta es la funcionalidad prevista, las aplicaciones RESTful no deberían modificar el estado con una solicitud GET.

Puede solucionar esto haciendo un enlace que utiliza el método DELETE mencionado por @Trip, @fuzzyalej, y la actualización por @Joseph Silvashy.

Alternativamente, (y menos recomendable), en /config/initializers/devise.rb, se puede hacer el siguiente cambio

config.sign_out_via = :delete 

a

config.sign_out_via = :get 

me encontré con este problema al siguiente junto con http://railscasts.com/episodes/209-introducing-devise y con la versión anterior del dispositivo que está usando allí, esto no fue un problema.

+1

Para mí, 'application.js' simplemente faltaba (plantilla rails 4 de railswizard.com) y necesitaba las líneas: ' // = jquery // = jquery_ujs' – snowking16

7

Sólo para que este post tiene una respuesta:

Este debe enviarse con el método delete para que no tenga un valor predeterminado de get

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %> 
0

Desde el rails documentation:

link_to("Destroy", "http://www.example.com", :method => :delete, :confirm => "Are you sure?") 
# => <a href='http://www.example.com' rel="nofollow" data-method="delete" data-confirm="Are you sure?">Destroy</a> 
3

Si está utilizando SSL con controladores Devise e intenta cerrar la sesión desde una URL 'http', lo que sucede es que envía la solicitud DELETE al método #destroy, pero luego la redirige a la versión https mediante GET. Puede solucionar este problema mediante la adición de los https para el enlace Salir de este modo:

= link_to "Sign out", destroy_user_session_url(protocol: 'https'), method: :delete 

Nota: debe ser 'url' en lugar de 'ruta'

+0

después del cambio: ¡Falló la conexión segura! (Código de error: ssl_error_rx_record_too_long) – Dineshkumar

0

que tenía el mismo problema y resolverlo Estos tomó pasos: 1) incluyen la // = requerir jquery_ujs en los activos/javascript/application.js 2) añadir la gema 'jquery-rails' a mi Gemfile 3) paquete de instalación

... y funcionó.

Cuestiones relacionadas