2009-09-11 8 views
6

De repente, en mi primera aplicación Rails, he comenzó a ver este error:rieles CookieOverflow

/!\ FAILSAFE /!\ Fri Sep 11 17:30:48 -0400 2009 
Status: 500 Internal Server Error 
ActionController::Session::CookieStore::CookieOverflow 

Un poco de investigación apunta a la utilización de cookies para guardar datos de sesión, pero no estoy haciendo eso (al menos no intencionalmente). Además, esto comenzó a suceder hoy. Lo único en lo que he empezado a trabajar hoy es la capacidad de cargar un archivo zip. El archivo comprimido que intento usar para probar es de 1.1 MB.

Además, Firebug muestra solo 2 cookies para este dominio. El que se llama _html_session es 507B y el que se llama user_credentials es 147B. ¿Los archivos cargados se almacenan temporalmente de tal manera que un archivo de gran tamaño podría estar causando esto? Cargar una sola imagen funciona bien.

Gracias por su ayuda.

ACTUALIZACIÓN: Oops. A diferencia de mis comentarios a Vitaly y xijo a continuación, el error no es bastante instantáneo. En este caso, estoy cargando algo en mi modelo Image y el error ocurre cuando mi ImagesController llama al @image.save!.

Lo que es interesante es que todavía no entiendo realmente donde ocurre el error. Creé un método Image#before_validation y lancé una excepción allí, pero el error CookieOverflow ocurre antes de que llegue allí. ¿Hay algún lugar en el que pueda soltar el código después de que el controlador realice la llamada de guardado y antes de esa devolución de llamada en particular? Mi entendimiento es que before_validation es la primera devolución de llamada.

+20

Es como desbordamiento de pila, pero más delicioso. – JoshJordan

Respuesta

3

lo único que viene a la mente es que de alguna manera puso su .zip en la sesión.

para depurarlo:

  • complemento 'requerir "ruby-debug"' a su environment.rb
  • encontrar el lugar donde se imprime el mensaje de error y poner un 'depurador' allí.
  • ejecutarlo y se detendrá cuando llegue al comando 'depurador'
  • examine la pila de llamadas para ver si hay algo relevante.
  • examinar la sesión en ese momento. ver qué exactamente toma el espacio allí.
+0

El problema es que se equivoca antes de que llegue al método 'create' del controlador. No se ejecuta código alguna vez, por lo que yo sé. –

+0

Vaya. Mentira inadvertida. No es muy instantáneo. He actualizado la pregunta original con lo que estoy viendo. –

0

no, los archivos cargados temporalmente se almacenan generalmente en su carpeta temporal y no tienen nada que ver con la cookie y su tamaño.

¿Qué almacena en su objeto de sesión y tal vez es realmente una buena idea comenzar a almacenar el objeto de sesión en la base de datos si lo usa permanentemente.

+0

Maldita sea, ya que es lo único (significativo) que puedo pensar que cambié, esperaba que ese fuera el problema. Se mencionó una sugerencia para mover el almacenamiento de la sesión a la base de datos, pero me gustaría descubrir qué está pasando aquí antes de hacerlo. Apreciar la respuesta. –

+0

¿Hizo algunos resultados como session.inspect para ver qué datos se escriben durante sus solicitudes? ¿Ocurre después de una serie de solicitudes o al instante? – xijo

+0

Definitivamente es instantáneo. Como acabo de comentar la respuesta de Vitaly, ni siquiera parezco llegar al método 'create' de mi controlador. Tengo mis cookies en la lista, pero solo hay 2 y el tamaño total es menor a 1MB (suponiendo que los informes de Firebug sean suficientes). –

8

Acabo de encontrarme con un problema similar hoy. Aparentemente, las sesiones de Rails solo pueden almacenar 4k de datos. Una posible solución es utilizar una tienda de base de datos para sus sesiones.

Para hacer esto:

  1. Añadir config.action_controller.session_store = :active_record_store a su archivo environment.rb.
  2. Crear un archivo de migración para sus sesiones utilizando rake db:sessions:create
  3. ejecutar la migración rake db:migrate

Esperanza esto ayuda

+0

Gracias. Buzzy. En mi caso, ni siquiera estaba escribiendo en la sesión (al menos no intencionalmente), así que esa fue la causa de mi confusión. –

+0

Mismo problema aquí, escribiendo accidentalmente una gran transmisión json en mi sesión. –

16

Esto puede suceder fácilmente si intenta almacenar un mensaje flash[:notice] = 'blah' que es demasiado largo, ya ese mensaje se almacena en la cookie de sesión.

+2

Salvavidas! Esto es exactamente lo que estaba causando este problema para mí. – Raoot