No hay coincidencias de ruta "/usuarios/cerrar sesión" devise rails 3


He instalado devise en mi aplicación y aplicado lo siguiente en mi archivo application.html.erb:

<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.

También, en mi archivo routes.rb 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 qué está causando el error?

Author: vich, 2011-07-02

29 answers

Creo que la ruta para cerrar sesión es un método DELETE. Esto significa que tu enlace de cierre de sesión debe tener este aspecto:

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

El tuyo no incluye la parte :method => :delete. Además, tenga en cuenta que para que esto funcione también debe incluir <%= javascript_include_tag :defaults %> en su archivo de diseño (application.html.erb).

 559
Author: Jessie Dedecker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-12 04:19:06

Cambié esta línea en devise.rb:

config.sign_out_via = :delete

A

config.sign_out_via = :get

Y empezó a funcionar para mí.

 130
Author: kitdesai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-12 04:31:26

Probablemente no haya incluido el archivo javascript jquery_ujs. Asegúrese de que está utilizando la última versión de jquery-ujs: https://github.com/rails/jquery-ujs y los últimos archivos disponibles:

rails generate jquery:install

Deberías no tener más rails.archivo js. Si lo haces, probablemente estás desactualizado. Asegúrese también de que este archivo esté cargado con los valores predeterminados, en config / application.rb

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)

(De nuevo, deberías no tener rails.archivo js aquí). Finalmente, agregue el enlace como está documentado en Devise wiki (estilo haml):

= link_to('Logout', destroy_user_session_path, :method => 'delete')

Y todo estará bien.

 58
Author: Gravis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-23 13:38:44

La capacidad de hacer del enlace de cierre de sesión una llamada RESTful DELETE 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 instalada la gema jquery-ujs o no está llamando al javascript resultante en su aplicación.html vía = javascript_include_tag "application", la respuesta será enviada 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:

  1. Cambiar config.sign_out_via a igual :get dentro de devise.rb (no se recomienda, ya que DELETE es la consulta RESTful apropiada)
  2. O Cambiar el link_to a = button_to('Logout', destroy_user_session_path, :method => :delete). Con button_to Rails hará el trabajo pesado al realizar la llamada de BORRADO adecuada. A continuación, puede estilizar el botón para que parezca un enlace si lo desea.
 31
Author: Will Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-30 20:11:50

Intenta agregar una nueva ruta a devise/sessions#destroy y enlaza con ella. Eg:

routes.rb
devise_for :users do
  get 'logout' => 'devise/sessions#destroy'
end

Vista:

<%= link_to "Logout", logout_path %>
 24
Author: Kevin Tsoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-12 20:43:48

Tuve el mismo problema con rails 3.1.0, y resolví añadir en file las siguientes líneas:

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
 13
Author: gringo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-01 22:27:39

Úsalo en tus rutas.archivo rb:

devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
end
 13
Author: Uma Maheswararao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-30 08:38:59

Con una excepción, la respuesta de Jessie funcionó para mí:

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

Cambio:

:delete

... a:

'delete'

Así que el código que funcionó para mí es:

<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
 10
Author: Galen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-14 04:43:09

Muchas respuestas a la pregunta ya. Para mí, el problema era doble:

  1. Cuando expando mis rutas:

    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  2. Me estaba advirtiendo que esto está depreciado, así que lo he reemplazado con:

    devise_scope :users do
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  3. Pensé que eliminaría mi jQuery. Mala elección. Devise está usando jQuery para" falsificar " la solicitud de ELIMINACIÓN y enviarla como GET. Por lo tanto usted necesita:

    //= require jquery
    //= require jquery_ujs
    
  4. Y, por supuesto, el mismo enlace que muchos mencionados anteriormente:

    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
    
 8
Author: Lukasz Muzyka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-22 14:10:05

Añadir:

  <%= csrf_meta_tag %>  and 
  <%= javascript_include_tag :defaults %>  to layouts

Utilice estas etiquetas link_to

 link_to 'Sign out', destroy_user_session_path, :method => :delete

  or

 link_to 'Sign out', '/users/sign_out', :method => :delete

En rutas añadir:

  devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
 7
Author: Amal Kumar S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-18 11:54:26

Otra opción es configurar el cierre de sesión para que sea un GET en lugar de un DELETE, puede hacerlo agregando la siguiente línea en /config/initializers/devise.rb

config.sign_out_via = :get

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) intente usar DELETE debido a la semántica de este método.

 7
Author: Rodrigo Flores,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-17 20:32:58

Si está utilizando Rails 3.1 asegúrese de que su aplicación.HTML.la salida de erb se ve así:

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

Y que su línea de inclusión de javascript se parece a la siguiente

<%= javascript_include_tag 'application' %>

Mi conjetura es que algunas gemas sobrescriben la nueva estructura del valor predeterminado.ubicación de js.

 6
Author: StlTenny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-06 02:42:11

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)

  • # El método HTTP predeterminado utilizado para cerrar sesión en un recurso. El valor predeterminado es: get. 188
  • # config. sign_out_via = :obtener 187
  • # El método HTTP predeterminado utilizado para cerrar sesión en un recurso. El valor predeterminado es: eliminar. 188
  • config.sign_out_via = : suprímase
 5
Author: Shane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-16 17:12:46

Bueno, chicos para mí solo fue eliminar el: method=>: delete

<%= link_to('Sign out', destroy_user_session_path) %>
 5
Author: workdreamer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-01 20:20:50

Esto significa que no ha generado los archivos jquery después de haber instalado la gema jquery-rails. Así que primero necesitas generarlo.

rails generate devise:install

Primera Opción:

Esto significa que tienes que cambiar la siguiente línea en /config/initializers/devise.rb

Config.sign_out_via =: delete to config.sign_out_via =: get

Segunda Opción:

Solo 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.

Normalmente :method => :delete no se escribe por defecto.

 5
Author: Deepak Lamichhane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-20 20:03:41

Quiero añadir 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 había agregado jQuery java script y utilizado etiquetas simples <script src=""/> para incluirlas.

Cuando los moví de after the :defaults a before, el sign_out comenzó a funcionar de nuevo.

Esperemos que esto ayude a alguien.

 5
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-22 05:12:27

No olvide incluir la siguiente línea en su solicitud.js (Rails 3)

//= require_self
//= require jquery
//= require jquery_ujs

Incluir jquery_ujs en mi aplicación rails y ahora funciona.

 4
Author: The Lazy Log,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-12 08:26:43

La mayoría de las respuestas son parciales. He golpeado este tema muchas veces. Hay que abordar dos cosas:

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

El método delete debe especificarse

Luego devise usa jquery, por lo que debe cargarlos

   <%= javascript_include_tag "myDirectiveJSfile" %> 

Y asegúrese de que TANTO jquery como jquery-ujs estén especificados en su myDirectiveJSfile.js

//= require jquery
//= require jquery_ujs
 3
Author: Jerome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-05 08:14:24

Si estás usando HTTPS con devise, se romperá si tu 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 utiliza HTTPS. Puede forzarlo con protocol: "https" en su ayudante de url (asegúrese de usar el ayudante de url y no el ayudante de ruta).

<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
 3
Author: Tyler Collier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-23 23:09:51
  devise_for :users
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
 3
Author: dipole_moment,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-12 17:10:53

En sus rutas.rb:

 devise_for :users do
    get '/sign_out' => 'devise/sessions#destroy'
    get '/log_in' => 'devise/sessions#new'
    get '/log_out' => 'devise/sessions#destroy'
    get '/sign_up' => 'devise/registrations#new'
    get '/edit_profile' => 'devise/registrations#edit'
 end

Y en su solicitud.HTML.erb:

<%if user_signed_in?%>
          <li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>
 2
Author: Uladzimir Khadakouski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-29 10:02:16

Esto es lo que hice (con Rails 3.0 e Idear 1.4.2):

  1. Asegúrese de que su página cargue rails.js
  2. Use este parámetro:' data-method ' = > 'delete'
  3. Buena idea agregar este parámetro:: rel = > 'nofollow'
 2
Author: Larry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-13 00:53:44

El ':method => :delete' en la página 'data-method="delete"' así que tu página debe tener jquery_ujs.js, enviará un enlace con el método eliminar no método get

 2
Author: user1599712,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-25 07:21:16

El problema comienza con rails 3.1... en /app/assets/javascript/ simplemente busque la aplicación.js.

Si el archivo no existe crea un archivo con ese nombre No se porque mi archivo desaparece o nunca fue creado en "rails new app"....

Ese archivo es la instancia de jquery....

 2
Author: rome3ro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-25 07:50:24

Hay muchas soluciones. pero sobre todo utilizar esto,

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

O config devise.rb con el método apropiado sign_out

En devise.rb

config.sign_out_via = :delete ( or  :get which u like to use.) 
 2
Author: jon snow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-24 15:12:35

Use :get y :delete método para su camino:

devise_scope :user do
  match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
 2
Author: Zakaria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-19 14:53:10

Ver si sus rutas.rb tiene un "resource: users" antes de un "devise_for: users" y luego intenta intercambiarlos:

  1. Funciona

    • devise_for: usuarios
    • recursos: usuarios
  2. Falla

    • recursos: usuarios
    • devise_for: usuarios
 1
Author: Charles Magid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-24 00:20:18

En general, cuando obtienes "No hay coincidencias de ruta" pero crees que tienes esa ruta definida, entonces verifica dos veces el verbo http / método de solicitud (si es get, put, post, delete, etc.).) para esa vía.

Si ejecuta rake routes, verá el método esperado y puede compararlo con el registro de solicitudes.

 1
Author: Muntasim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-09 07:49:19

Sé que esta es una vieja pregunta basada en Rails 3, pero me encontré y la resolví en Rails 4.0.4. Así que pensé en echarle un vistazo a cómo lo arreglé para cualquiera que se encuentre con 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 bundle install.

gem 'jquery-rails'

gem 'turbolinks'

gem 'jquery-turbolinks'

En aplicación.js compruebe que todo es necesario como a continuación.

Cuidado si esto te atrapó : es //= require jquery.turbolinks y no //= require jquery-turbolinks

//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require_tree .

A continuación, agregue los enlaces apropiados en el encabezado de la aplicación.HTML.erb.

<%= javascript_include_tag  "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>

Parece que hay muchas variaciones sobre cómo implementar el método delete que supongo depende de la versión de Rails que esté utilizando. Esta es la sintaxis delete que usé.

<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>

¡Espero que eso ayude a sacar a alguien de este agujero tan frustrante!

 0
Author: mikeym,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-04 04:55:51