Las variables de sesión de Rails no se configuran/aprueban como se esperaba

Gracias por echar un vistazo a esta pregunta relativamente nu-b.

Tengo una aplicación web creada en Rails 3 que permite a los usuarios ver varias historias a la vez, y cada historia tiene varias publicaciones. Uso JS para sondear el servidor a intervalos regulares para buscar nuevas publicaciones en todas las historias abiertas. Utilizo variables de sesión para realizar un seguimiento de dónde terminé mi última búsqueda de cada una de esas historias abiertas para no tener que buscar en toda la tabla de publicaciones desde cero cada vez que consulto el servidor.

Aquí está la acción para cuando un usuario abre una historia por primera vez:

def open_story
    story = Story.find(params[:story_id])
    #keep track of the last post searched for each open story so to assist when we poll for new posts to that story
    last_post_searched = Post.last.id
    session["last_post_searched_for_story_#{story.id}"] = last_post_searched 
    @posts = story.posts.where("posts.id <= ?", last_post_searched)
    respond_with @posts
end

Esta es la acción para cuando el cliente sondea el servidor en busca de nuevas actualizaciones de publicaciones en una variedad de historias abiertas:

  def update_stories
    open_stories_id_array = params[:open_stories]
    open_stories_id_array.each { |open_story_id|
debugger
      start_search_at_post_id = session["last_post_searched_for_story_#{open_story_id}"] + 1
      session["last_post_searched_for_story_#{open_story_id}"] = Post.last.id
      story = Story.find(open_story_id)
      updates = story.posts.where("posts.id between ? AND ?", 
          start_search_at_post_id, session["last_post_searched_for_story_#{open_story_id}"])
      results[open_story_id] = updates
    }
    respond_with(results)
  end

Por razones que no puedo entender, mis variables de sesión no se incrementan al nuevo Post.last.id en mi acción update_stories de manera oportuna. Así es como puedo recrear el problema:

  1. Digamos que tengo 30 publicaciones en mi base de datos para varias historias diferentes.
  2. Llamo a open_story en la historia 1. Esto establece session["last_post_searched_for_story_1"] en 30.
  3. Luego hago una nueva publicación en la historia 1 (publicación 31).
  4. Mi cliente sondea la acción update_stories para obtener nuevas publicaciones para la historia 1.
  5. update_stories busca publicaciones con ID entre 31 y 31 para la historia con ID de 1 y devuelve la publicación que acabo de hacer.
  6. Luego, un poco más tarde, mi cliente sondea automáticamente update_stories nuevamente para verificar si hay nuevas publicaciones en la historia 1. Aquí es donde ocurre el problema.

En lugar de session["last_post_searched_for_story_1"] que contiene el valor 31, conserva su valor anterior de 30 para que mi búsqueda en la base de datos devuelva mi nueva publicación original por segunda vez. A menudo, mi cliente llamará a update_stories varias veces antes de que session["last_post_searched_for_story_1"] aumente a 31. Es casi como si la variable de sesión fuera muy lenta para guardar su nuevo valor, o estoy experimentando algún tipo de problema de carga diferida.

Cualquier ayuda para resolver este problema sería muy apreciada y aceptada con entusiasmo.

Muchas Gracias

Por cierto, como todavía tengo mucho que aprender, siéntase libre de dar su opinión sobre mejores formas de manejar este problema o si estoy violando las mejores prácticas de Rails.

preguntado el 22 de mayo de 12 a las 18:05

Después de un poco más de depuración, parece que mi almacén de cookies no se comporta como se esperaba. No he hecho nada para cambiar el valor predeterminado de Rails 3 desde el almacén de cookies, pero el servidor no pasa cookies al cliente (al menos, no lo creo). ¿Alguien puede indicarme la dirección correcta para asegurarme de que mis variables de sesión estén configuradas correctamente? -

Esto es lo que hay actualmente en mi initializers/session_store.rb: Nw001::Application.config.session_store :cookie_store, :key => '_nw0.0.1_session' -

1 Respuestas

Veo 2 problemas con tu código:

Es posible que desee ordenar primero sus resultados antes de aplicar el último método. El último registro devuelto por la base de datos no es necesariamente el último que se crea.
En segundo lugar, para seleccionar la última publicación, debe aplicar el último criterio solo a las publicaciones de esa historia y luego seleccionar la última publicación de esa historia.
Entonces, en lugar de esto:

story = Story.find(params[:story_id])
#keep track of the last post searched for each open story so to assist when we poll for new posts to that story
last_post_searched = Post.last.id

Podrías tenerlo así:

story = Story.find(params[:story_id])
last_post_searched = Post.joins(:stories).where("stories.id = ?", story.id).order("posts.created_on DESC").first  

contestado el 24 de mayo de 12 a las 00:05

Esto no tiene nada que ver con problemas de sesión. - Nick

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.