Instalé el dispositivo en mi aplicación y apliqué lo siguiente en mi application.html.erb
archivo:
<div id="user_nav">
<% if user_signed_in? %>
Signed in as <%= current_user.email %>. This cannot be cheese?
<%= link_to 'Sign out', destroy_user_session_path %>
<% else %>
<%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %>
<% end %>
</div>
Corrí rake routes
y confirmó que todas las rutas son válidas.
Además, en mi routes.rb
archivo tengo devise_for :users
y root :to => "home#index"
.
Recibo el siguiente error de enrutamiento al hacer clic en el enlace "Cerrar sesión":
No route matches "/users/sign_out"
¿Alguna idea de lo que está causando el error?
gem 'devise', :git => 'git://github.com/plataformatec/devise.git'
. Sin embargo, eso no hizo nada.Respuestas:
Creo que la ruta para cerrar sesión es un
DELETE
método. Esto significa que su enlace de cierre de sesión debe tener este aspecto:El tuyo no incluye la
:method => :delete
parte. Además, tenga en cuenta que para que esto funcione también debe incluirlo<%= javascript_include_tag :defaults %>
en su archivo de diseño (application.html.erb
).fuente
link_to "Sign out", destroy_user_session_path
siempre ha sido lo suficientemente bueno para mí.$("<a href='/users/sign_out' data-method='delete'>Sign out</a>").appendTo('body');
, si jQuery está cargado en la página.Cambié esta línea en devise.rb:
a
y comenzó a funcionar para mí
fuente
config.sign_out_via = [ :post, :delete ]
odevise_for :users, :sign_out_via => [ :post, :delete ]
, como se describe en devise / rails / routes.rb .Probablemente no haya incluido el archivo jquery_ujs javascript. Asegúrese de estar utilizando la última versión de jquery-ujs: https://github.com/rails/jquery-ujs y los últimos archivos disponibles:
Usted debe no tener ningún archivo más rails.js. Si lo hace, probablemente esté desactualizado. Asegúrese también de que este archivo esté cargado con los valores predeterminados, en config / application.rb
(Una vez más, usted debe no tener archivo rails.js aquí). Finalmente, agregue el enlace como se documenta en Devise wiki (estilo haml):
Y todo estará bien.
fuente
javascript_include_tag "jquery_ujs"
application.js
. Mala suposición, supongo. Gracias.La capacidad de hacer que el enlace Cerrar sesión sea una llamada BORRAR RESTful requiere un atributo html
data-method = "delete"
utilizando el código rails= link_to('Logout', destroy_user_session_path, :method => :delete)
.Sin embargo, si no tiene la gema
jquery-ujs
instalada o no está llamando al javascript resultante en su application.html a través de= javascript_include_tag "application"
, la respuesta se enviará como una solicitud GET y la ruta fallará.Tiene algunas opciones si no desea usar
jquery-ujs
o no puede encontrar una manera de hacerlo funcionar:config.sign_out_via
a igual:get
dentrodevise.rb
(no recomendado, ya que DELETE es la consulta RESTful apropiada)link_to
a= button_to('Logout', destroy_user_session_path, :method => :delete)
. Conbutton_to
Rails hará el trabajo pesado al hacer la llamada ELIMINAR adecuada. Luego puede diseñar el botón para que se vea como un enlace si lo desea.fuente
button_to
, Rails genera unform
para toda la acción. Es por eso que es posible usar el:delete
método conbutton_to
y no conlink_to
, solo vea el HTML generado.Intente agregar una nueva ruta para idear / sesiones # destruir y vincular a eso. P.ej:
ver:
fuente
link_to
llamada, como se describe en la otra respuesta.Úselo en su archivo routes.rb:
fuente
Tuve el mismo problema con rails 3.1.0, y resolví agregar en el archivo las siguientes líneas:
fuente
Con una excepción, la respuesta de Jessie funcionó para mí:
cambio:
... a:
Entonces el código que funcionó para mí es:
fuente
Muchas respuestas a la pregunta ya. Para mí, el problema era doble:
cuando amplío mis rutas:
Estaba recibiendo una advertencia de que esto se depreciaba, así que lo reemplacé con:
Pensé que eliminaría mi jQuery. Mala elección. Devise está utilizando jQuery para "falsificar" la solicitud DELETE y enviarla como GET. Por lo tanto, necesitas:
y, por supuesto, el mismo enlace que muchos mencionados anteriormente:
fuente
Añadir:
Use estas etiquetas link_to
En rutas agregar:
fuente
Otra opción es configurar el cierre de sesión para que sea GET en lugar de DELETE, puede hacerlo agregando la siguiente línea en
/config/initializers/devise.rb
Pero como Steve Klabnik escribió en su blog (http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html ) intenta usar DELETE debido a la semántica de este método.
fuente
Si está utilizando Rails 3.1, asegúrese de que su cierre de sesión application.html.erb se vea así:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
Y que su línea de inclusión de JavaScript se parezca a la siguiente
<%= javascript_include_tag 'application' %>
Supongo que algunas gemas sobrescriben la nueva estructura de la ubicación default.js.
fuente
Compruébalo con el código fuente en github:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (fecha: 27 de junio de 2011)
fuente
Bueno, chicos, para mí solo fue eliminar el: método =>: eliminar
fuente
Esto significa que no ha generado los archivos jquery después de haber instalado la gema jquery-rails. Entonces primero necesitas generarlo.
rails generate devise:install
Primera opción:
Esto significa que debes cambiar la siguiente línea en
/config/initializers/devise.rb
config.sign_out_via =: eliminar a config.sign_out_via =: obtener
Segunda opción:
Sólo cambia esta línea
<%= link_to "Sign out", destroy_user_session_path %>
a<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
en el archivo de vista.Por
:method => :delete
lo general, no está escrito por defecto.fuente
Quiero agregar a esto a pesar de que es un poco viejo.
el enlace "sign_out" no funcionó, a pesar de tener: method =>: delete.
El comentario que indica que
<%= javascript_include_tag :defaults %>
debe incluirse me recordó que recientemente agregué el script Java JQuery y usé<script src=""/>
etiquetas simples para incluirlos.Cuando los moví después de: el valor predeterminado es antes, el inicio de sesión comenzó a funcionar nuevamente.
Esperemos que esto ayude a alguien.
fuente
La mayoría de las respuestas son parciales. He tocado este problema muchas veces. Deben abordarse dos cosas:
el método de eliminación debe especificarse
Luego, crea jquery, por lo que debes cargar esos
y asegúrese de que AMBOS jquery y jquery-ujs estén especificados en su myDirectiveJSfile.js
fuente
No olvide incluir la siguiente línea en su application.js (Rails 3)
Incluir
jquery_ujs
en mi aplicación de rieles y funciona ahora.fuente
Si está utilizando HTTPS con idear , se romperá si su enlace de cierre de sesión es a la versión no segura. En el back-end, redirige a la versión segura. Esa redirección es un GET, que causa el problema.
Asegúrese de que su enlace use HTTPS. Puede forzarlo
protocol: "https"
en su asistente de URL (asegúrese de usar el asistente de URL y no el asistente de ruta).fuente
fuente
El problema comienza con los rieles 3.1 ...
/app/assets/javascript/
solo busque application.js.Si el archivo no existe, cree un archivo con ese nombre, no sé por qué mi archivo desaparece o nunca se creó
"rails new app"...
.Ese archivo es la instancia para
jquery...
.fuente
Muchas soluciones están ahí. pero sobre todo usa esto,
o config devise.rb con el método apropiado de sign_out
En devise.rb
fuente
uso
:get
y:delete
método para su camino:fuente
En su route.rb:
y en su application.html.erb:
fuente
Esto es lo que hice (con Rails 3.0 y Devise 1.4.2):
fuente
Vea si su route.rb tiene un "recurso: usuarios" antes de un "dispositivo_para: usuarios", luego intente intercambiarlos:
Trabajos
Falla
fuente
el
':method => :delete
'en la página es'data-method="delete"
', por lo que su página debe tener jquery_ujs.js, enviará un enlace con el método eliminar, no el método obtenerfuente
Sé que esta es una vieja pregunta basada en Rails 3, pero acabo de encontrarla y la resolví en Rails 4.0.4. Así que pensé en explicar cómo lo solucioné para cualquiera que encuentre este problema con esta versión. Su kilometraje puede variar, pero esto es lo que funcionó para mí.
Primero asegúrese de tener las gemas instaladas y ejecute la instalación del paquete.
En application.js verifique que todo se requiera como a continuación.
Tenga cuidado si esto tiene : es
//= require jquery.turbolinks
y no//= require jquery-turbolinks
A continuación, agregue los enlaces apropiados en el encabezado de application.html.erb.
Parece que hay muchas variaciones sobre cómo implementar el método de eliminación, que supongo que depende de la versión de Rails que esté utilizando. Esta es la
delete
sintaxis que utilicé.¡Espero que eso ayude a sacar a alguien de este agujero muy frustrante!
fuente
En general, cuando obtiene "No hay coincidencias de ruta" pero cree que tiene esa ruta definida, luego verifique dos veces el método de verbo / solicitud http (ya sea get, put, post, delete, etc.) para esa ruta .
Si ejecuta rutas de rastrillo, verá el método esperado y podrá compararlo con el registro de solicitudes.
fuente