tutorial sign_in rails method generate gema ejemplos ruby-on-rails ruby-on-rails-3 devise routes

ruby on rails - sign_in - Ninguna ruta coincide con los dispositivos "/ users/sign_out" 3



gema devise (29)

Úsalo en tu archivo route.rb:

devise_for :users do get ''/users/sign_out'' => ''devise/sessions#destroy'' end

Instalé el dispositivo en mi aplicación y apliqué 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.

Además, en mi archivo routes.rb tengo devise_for :users and 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?


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 las rutas añadir:

devise_for :users do get ''/users/sign_out'' => ''devise/sessions#destroy'' end


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

<%= link_to(''Sign out'', destroy_user_session_path) %>


Cambié esta línea en devise.rb:

config.sign_out_via = :delete

a

config.sign_out_via = :get

Y empezó a trabajar para mí.


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: obtener. 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 =: eliminar

Comprueba si tus route.rb tiene un "recurso: usuarios" antes de un "devise_for: users" y luego intenta intercambiarlos:

  1. Trabajos

    • devise_for: usuarios
    • recursos: usuarios
  2. Falla

    • recursos: usuarios
    • devise_for: usuarios

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'' %>


Creo que la ruta para cerrar sesión es un método DELETE . Esto significa que su enlace de cierre de sesión debe verse así:

<%= 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 ).


El problema comienza con los rieles 3.1 ... en /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ó en "rails new app"...

Ese archivo es la instancia para jquery...


En general, cuando obtiene "No hay coincidencias de ruta", pero cree que tiene esa ruta definida, verifique dos veces el método del verbo / solicitud http (ya sea obtener, poner, publicar, eliminar, etc.) para esa ruta .

Si ejecuta rutas de rake, verá el método esperado y puede comparar esto con el registro de solicitud.


En tus 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 application.html.erb:

<%if user_signed_in?%> <li><%= link_to "Sign_out", sign_out_path %></li> <% end %>


Esto es lo que hice (con Rails 3.0 y Devise 1.4.2):

  1. Asegúrate de que tu página cargue rails.js
  2. Use este parámetro: ''método de datos'' => ''eliminar''
  3. Buena idea para agregar este parámetro:: rel => ''nofollow''

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 debe cambiar la siguiente línea en /config/initializers/devise.rb

config.sign_out_via =: eliminar a config.sign_out_via =: obtener

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.

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


Intente agregar una nueva ruta para diseñar / session # destroy y vincular a eso. P.ej:

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

ver:

<%= link_to "Logout", logout_path %>


La capacidad de hacer que el enlace de cierre de sesión sea una llamada DELETE RESTful requiere un atributo html data-method = "delete" utilizando el código de rieles = link_to(''Logout'', destroy_user_session_path, :method => :delete) .

Sin embargo, si no tiene la gema jquery-ujs instalada o no está llamando el javascript resultante en su aplicación.html via = javascript_include_tag "application" , la respuesta se enviará como una solicitud GET y la ruta fallará.

Tienes algunas opciones si no quieres usar jquery-ujs o no puedes encontrar una manera de hacerlo funcionar:

  1. Cambie config.sign_out_via a igual :get dentro de devise.rb (no recomendado, ya que DELETE es la consulta RESTful apropiada)
  2. O cambie el link_to a = button_to(''Logout'', destroy_user_session_path, :method => :delete) . Con button_to Rails hará el trabajo pesado al hacer la llamada DELETE correcta. A continuación, puede diseñar el botón para que parezca un enlace si lo desea.

La mayoría de las respuestas son parciales. He golpeado este tema muchas veces. Dos cosas deben ser abordadas:

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

el método de borrado necesita ser especificado

Luego, inventa los usos de jquery, por lo que necesitas cargarlos.

<%= javascript_include_tag "myDirectiveJSfile" %>

y asegúrese de que AMBOS jquery y jquery-ujs estén especificados en myDirectiveJSfile.js

//= require jquery //= require jquery_ujs


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

  1. Cuando amplío mis rutas:

    devise_for :users do get ''/users/sign_out'' => ''devise/sessions#destroy'' end

  2. Recibí una advertencia de que esto está depreciado, así que lo reemplacé con:

    devise_scope :users do get ''/users/sign_out'' => ''devise/sessions#destroy'' end

  3. Pensé que voy a quitar mi jQuery. Mala elección. Devise está usando jQuery para "falsificar" la solicitud DELETE y enviarla como GET. Por lo tanto necesitas:

    //= require jquery //= require jquery_ujs

  4. y por supuesto el mismo enlace que muchos mencionaron antes:

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


Muchas soluciones están ahí. pero sobre todo usa esto,

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

o config devise.rb con el método de inicio de sesión correcto

En Devise.rb

config.sign_out_via = :delete ( or :get which u like to use.)


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

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

Incluir jquery_ujs en mi aplicación de rieles y funciona ahora.


Otra opción es configurar el cierre de sesión para que sea un GET en lugar de un BORRADO, 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 ) trate de usar BORRAR debido a la semántica de este método.


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

rails generate jquery:install

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

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

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

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

Y todo estará bien.


Quiero agregar a esto aunque es un poco viejo.

el enlace "sign_out" no funcionó, a pesar de tener: method =>: delete.

El comentario que indica que debe incluirse <%= javascript_include_tag :defaults %> me recordó que recientemente había agregado el script jQuery java y usé etiquetas <script src=""/> simples para incluirlos.

Cuando los moví después de: por defecto a antes, sign_out comenzó a funcionar nuevamente.

Esperemos que esto ayude a alguien.


Sé que esta es una pregunta antigua basada en Rails 3 pero acabo de encontrarla y la resolví en Rails 4.0.4. Así que pensé en lanzar la forma en que lo solucioné para cualquier persona que tuviera 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 application.js verifique que todo se requiera como a continuación.

Cuidado si esto se tiene : 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 application.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 de eliminación, que asumo depende de la versión de Rails que esté utilizando. Esta es la sintaxis de delete que usé.

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

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


Si está utilizando HTTPS con un dispositivo , se romperá si su enlace de cierre de sesión es a la versión no segura. En el extremo posterior, 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 el 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 %>


Si está utilizando Rails 3.1, asegúrese de que el cierre de sesión de 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 parece a la siguiente

<%= javascript_include_tag ''application'' %>

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


Tuve el mismo problema con los rieles 3.1.0, y resolví agregar en el archivo las siguientes líneas:

app/assets/javascripts/application.js //= require_tree //= require jquery //= require jquery_ujs


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 delete no el método get


usa :get y :delete método para tu ruta:

devise_scope :user do match ''/users/sign_out'' => ''devise/sessions#destroy'', :as => :destroy_user_session, via: [:get, :delete] end


devise_for :users devise_scope :user do get ''/users/sign_out'' => ''devise/sessions#destroy'' end