Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

479
Vistas
Rails no recarga la sesión en la publicación ajax

Estoy experimentando un problema muy extraño con Rails y ajax usando jQuery (aunque no creo que sea específico de jQuery).

La aplicación My Rails usa el almacén de sesión de cookies y tengo un inicio de sesión muy simple que establece la identificación del usuario en la sesión. Si el user_id no está configurado en la sesión, se redirige a una página de inicio de sesión. Esto funciona sin problemas. Las solicitudes JQuery GET también funcionan bien. El problema es cuando hago un jQuery POST: el navegador envía la cookie de sesión correctamente (lo confirmé con Firebug y descargué request.cookies en el registro), pero la sesión está en blanco, es decir, la sesión es {}.

Estoy haciendo esto en mi application.js:

 $(document).ajaxSend(function(e, xhr, options) { var token = $("meta[name='csrf-token']").attr('content'); xhr.setRequestHeader('X-CSRF-Token', token); });

y aquí está mi publicación de muestra:

 $.post('/test/1', { _method: 'delete' }, null, 'json');

que debería llegar a este método de controlador (_method: delete):

 def destroy respond_to do |format| format.json { render :json => { :destroyed => 'ok' }.to_json } end end

Mirando el registro y usando Firebug, puedo confirmar que se envía el valor correcto de la cookie en el encabezado de la solicitud cuando se produce la publicación de ajax, pero parece que en algún momento Rails pierde este valor y, por lo tanto, pierde la sesión, por lo que redirige al inicio de sesión. página y nunca llega al método.

Intenté todo lo que se me ocurrió para depurar esto, pero se me ocurre la idea de que podría tratarse de un error en Rails. Estoy usando Rails 3.0.4 y jQuery 1.5 si eso ayuda. Me parece muy extraño que las solicitudes de obtención y publicación regulares (es decir, no ajax) funcionen, y las solicitudes de obtención de ajax funcionen sin problemas, son solo las publicaciones de ajax las que no lo hacen.

¡Cualquier ayuda para tratar de solucionar esto sería muy apreciada!

Muchas gracias,
dave

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Voy a responder a mi propia pregunta ya que logré averiguar qué estaba pasando. ¡Lo publicaré aquí en caso de que sea útil para alguien más!

Después de investigar más, descubrí que el código que se suponía que estaba configurando el encabezado de la solicitud con el token CSRF no lo estaba. Este era el código original:

 $(document).ajaxSend(function(e, xhr, options) { var token = $("meta[name='csrf-token']").attr('content'); xhr.setRequestHeader('X-CSRF-Token', token); });

Lo que sucedía era que este código no estaba configurando el encabezado, Rails estaba recibiendo una solicitud de Ajax, el token no coincidía y estaba reiniciando la sesión. Esto solía generar un error de ActionController::InvalidAuthenticityToken (supongo que lo habría detectado antes si se generara un error ... bueno), pero desde Rails 3.0.4 ahora simplemente reinicia la sesión silenciosamente.

Entonces, para enviar el token en el encabezado, debe hacer esto (muchas gracias a esta maravillosa publicación de blog ):

 $.ajaxSetup({ beforeSend: function(xhr) { xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); } });

Y ahora todo funciona como debería. Lo cual es bueno.

over 4 years ago · Santiago Trujillo Denunciar

0

Encontré otro caso:

¿Configuró el 'csrf_meta_tag' en el archivo de diseño de su aplicación?

en mi caso, no configuré esa etiqueta y encontré el mismo problema con el tuyo.

Y después de configurar csrf_meta_tag en app/views/layouts/application.html.erb, ¡todo funciona bien!

¡Por fin, gracias por ayudarme a encontrar la causa raíz! muchas gracias ~

over 4 years ago · Santiago Trujillo Denunciar

0

Si aún tiene problemas después de enviar csrf_meta_tag correctamente al servidor. Asegúrese de que la configuración de su almacén de sesión sea correcta.

Si :secure se establece en verdadero en su session_store.rb , la cookie (sesión) no se transmitirá a su servidor http. documentos:https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda