ruby on rails - not - Idear: ¿Por qué no funciona mi enlace de cierre de sesión?
devise rails ejemplos (17)
1) Creo que es posible que tengas que instalar debajo de la gema, la solicitud con el método:: delete funcionará en otro caso, puede ir como obtener
https://github.com/rails/jquery-rails
2) Añade estas dos líneas abajo en application.js
//= require jquery
//= require jquery_ujs
El problema: en pocas palabras, cuando intento instalar un enlace de cierre de sesión en mi aplicación, no funciona. Aquí hay tanto contexto como puedo pensar para poner aquí (si quieres algo más, por favor, pégame) ...
Tengo esto en una vista de haml:
= link_to("Logout", destroy_user_session_path, :method => :delete)
Genera esto en la vista:
<a href="/users/sign_out" data-method="delete" rel="nofollow">Logout</a>
Verifiqué que en mi config / initializers / devise.rb tengo esta configuración sin comentarios y correcta:
config.sign_out_via = :delete
Validé la siguiente ruta:
destroy_user_session DELETE /users/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
También tengo un poco de engaño en mis rutas.rb, y sospecho que esto está relacionado con mi problema:
devise_for :users, :controllers => {:sessions => "devise/sessions", :registrations => "users"}
resources :users
Este último bit se debe a que quiero administrar (editar, crear y eliminar) usuarios en mi propio controlador.
El mensaje de error que estoy recibiendo es el siguiente:
ActiveRecord::RecordNotFound in UsersController#show
Couldn''t find User with ID=sign_out
Rails.root: /home/jaydel/projects/mbsquared-projects/Wilson-Goldrick
app/controllers/users_controller.rb:16:in `show''
En mis registros de servidor veo esto para la solicitud:
Started GET "/users/sign_out" for 127.0.0.1 at 2011-08-04 13:08:51 -0500
Processing by UsersController#show as HTML
Parameters: {"id"=>"sign_out"}
¿Alguien tiene alguna idea?
Como lo mencionó Tombart anteriormente, la respuesta para mí fue volver a poner la llamada rails-ujs en mi archivo application.js.
//= require rails-ujs
//= require turbolinks
Inicialmente los había eliminado para evitar que se reevalúen mis scripts en el pie de página. Mi solución fue crear un archivo de compilación footer.js con los recursos que quería en el pie de página.
//= require jquery-3.2.1.min
//= require jquery-ui-1.12.1.min
//= require materialize
//= require init
Luego en mi archivo /initializers/assets.rb agregando una precompilación
Rails.application.config.assets.precompile += %w( footer.js )
Luego puede llamar a lo siguiente en su archivo layout / application.html.erb.
<%= javascript_include_tag ''application'', ''data-turbolinks-track'' => true %>
<%= javascript_include_tag ''footer'' %>
Mantengo la línea de aplicación en mi encabezado y agregué mi nueva llamada de "pie de página" antes del final de mi etiqueta de cuerpo.
El problema radica en el hecho de que en sus registros la solicitud de cierre de sesión es una solicitud GET.
Started GET "/users/sign_out"
Pero la ruta de salida es un BORRAR
destroy_user_session DELETE /users/sign_out(.:format)
La razón por la que está obteniendo la excepción es que se confunde con una de las rutas creadas por los resources :users
que serían algo así como
edit_user GET /users/(:id)(.:format) {:action=>"edit", :controller=>"users"}
Básicamente, ''sign_out'' se está confundiendo con un id.
No estoy seguro de por qué el enlace de eliminación no se está procesando como una solicitud DELETE. Aunque cambiando
config.sign_out_via = :delete
to be :get
podría resolver el problema.
Esta es una pregunta antigua, pero la respuesta aceptada no es la forma adecuada de resolver este problema (aunque es un buen diagnóstico del problema).
Cuando me encontré con esto hoy, mi archivo de rutas apareció como:
root :to => ''welcome#index''
resources :users
devise_for :users
Como lo mencionó Olives, la declaración de recursos simplemente está haciendo que / usuarios / cualquier cosa tropiece. Simplemente necesitaba revertir el orden de mis rutas ...
root :to => ''welcome#index''
devise_for :users
resources :users
Esta es una pregunta antigua, pero quería una forma que no requiriera JavaScript. Rails habilita las solicitudes "DELETE" con una entrada oculta que establece el method
para delete
. Use un <form>
real y deje que Rails genere las entradas ocultas necesarias:
<%= form_for(resource, as: resource_name,
url: destroy_user_session_path, html: { method: :delete }) do |f| %>
<%= f.submit "Log out" %>
<% end %>
Lo anterior genera algo como:
<form accept-charset="UTF-8" action="/users/sign_out" method="post">
<div style="display:none">
<input name="utf8" type="hidden" value="✓">
<input name="_method" type="hidden" value="delete">
<input name="authenticity_token" type="hidden" value="1234">
</div>
<input name="commit" type="submit" value="Log out">
</form>
Estoy de acuerdo en que es más reparador utilizar el método http DELETE, me gusta crear un punto final simple para destruir una sesión de usuario con un método GET.
agregando esto a config / route.rb
devise_scope :user do
get ''/logout'', :to => ''sessions#destroy''
end
He comprobado todas estas soluciones, pero nadie ha trabajado para mí. Finalmente encontré que en el encabezado eliminé dos líneas, incluidas las etiquetas de aplicación y csrf meta
Por lo tanto, si alguien tiene este problema sin problemas en este momento, verifique si tiene el encabezado de la página (notación HAML)
= javascript_include_tag ''application''
= csrf_meta_tags
La forma correcta de solucionar este problema, REST-sabio, sería cambiar los enlaces de cierre de sesión para usar el método DELETE. Es una solución muy fácil, cambiando esto:
link_to "Log out", destroy_user_session_path
a esto:
link_to "Log out", destroy_user_session_path, :method => :delete
Necesitas ambos
link_to "Log out", destroy_user_session_path, method: :delete
&& estos incluidos en application.js
//= require jquery
//= require jquery_ujs
. Obviamente, no olvide agregar esto a Gemfile si por alguna razón no está allí.
gem ''jquery-rails''
Se requiere jQuery para realizar la solicitud con DELETE. Asegúrate de no haberlo eliminado de tu application.js.
Si está encontrando este problema en la producción y está utilizando la canalización de activos, a menudo necesita:
rake assets:clobber
para borrar sus activos públicos. Luego rake assets:precompile
antes de cometer y empujar su código (a menos que su push también precompile, también conocido como Heroku).
Si también tiene más de una fuente de jQuery en su aplicación Rails, necesita usar la predeterminada especificada en Gemfile.
Asegúrese de que en su Gemfile tiene esto
gem ''jquery-rails''
y en sus activos no tiene ningún otro archivo fuente de JQuery.
en mi caso tuve un segundo archivo JQuery distinto del predeterminado como se declara en el Gemfile, por lo que causó conflictos.
Si anteriormente tenías esas fuentes, asegúrate de precompilar los activos nuevamente si ya lo habías hecho.
También tiene que verificar, resources :users
bajo devise_for :users
y es el método de enlace eliminar
link_to "Logout", destroy_user_session_path, method: :delete
Si ambos tienen razón, su botón de cierre de sesión debería funcionar
Tuve el mismo problema con los rieles 3.2 cuando eliminé de application.js
esta línea:
//= require jquery_ujs
Entonces, creo que tienes que insertar esta línea en tu application.js
si no la tienes allí.
PD. Este comportamiento significa que el adaptador de rieles para jquery
no funciona. Por lo tanto, debe asegurarse de que esté cargado en su html en el navegador. Debería probarlo en modo de desarrollo porque habrá comprimido js en producción y será muy difícil encontrar algo allí.
Tuve que hacer esto de una manera diferente, ya que mi application.rb tenía:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
y seguía fallando. Resulta que necesitaba configurar config.serve_static_assets = true
en / environment / development, test y production.rb. Este enlace fue lo que me ayudó a resolverlo.
Ya que el OP mencionó el dispositivo y este problema también me sucedió a mí, solo quería intervenir. @Ross Allen tuvo la respuesta correcta cuando no quiere usar jQuery_ujs. Rails proporciona un par de ayudantes para resolver esto sin jQuery.
Esta es la respuesta de Ross pero usando el modelo de usuario actual de Devise:
<%= form_for(current_user,
url: destroy_user_session_path, html: { method: :delete }) do |f| %>
<%= f.submit "Log out" %>
<% end %>
O el button_to ayuda más button_to que crea una forma similar:
<%= button_to "Log out", destroy_user_session_path, method: :delete %>
la razón puede estar en el orden incorrecto conexión bootstrap-sprockets
el orden correcto:
// app/assets/javascripts/application.js
...
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-sprockets
//= require_tree .