¿En qué punto es una mala práctica usar atributos de datos al hacer llamadas ajax en Ruby on Rails?

Mi problema viene con los enlaces de navegación/desplazamiento sin fin.

He incluido un botón de "eliminar" para cada micromensaje. Cuando se presiona ese botón, hay una llamada ajax al servidor y el micropost se elimina y el div se elimina del DOM.

Digamos que tengo micromensajes del 1 al 10 en la primera página, micromensajes del 11 al 20 en la segunda, etc. Digamos que elimino los elementos 1, 2 y 3 de la primera página. Luego desplácese hacia abajo. El servidor "recalculará" los micromensajes; como eliminé 3 de la lista anterior, devolverá los elementos 13 a 22. Es decir, los micromensajes 10, 11 y 12 no aparecen en la primera página ni en la segunda.

Después de buscar en stackoverflow, encontré una solución:

Cada vez que elimino una micropublicación de la lista, cargo la micropublicación que vino justo después de la última micropublicación en la página y la inserto en la parte inferior.

Cómo me va actualmente con la solución:

De manera predeterminada, muestro 10 micromensajes en una página usando la gema will_paginate. Necesito saber la identificación de cualquier micromensaje que se muestre en un momento dado. Lo logro almacenándolo en la etiqueta div de apertura del contenedor que contiene cada micromensaje:

<% @microposts.each do |m| %>
     <div class="postHolder" data-micropost-id="<%= m.id %>">

Accedo así en mi archivo de activos microposts.js:

$(function() {

     $('.message_delete').on('ajax:success', function(event, data, status, xhr){
          console.log(data); //to check if json is working
          console.log($('.postHolder').last().data('micropost-id'));
     });
});

Aquí está la acción de destrucción de mi controlador:

def destroy
    micropost = Micropost.find(params[:id])
       respond_to do |format|   
         micropost.destroy
       format.json  { render :json => micropost } #just to check if json is working
    end
end

Ahora sé la ID de cada micromensaje, así que cuando se elimina uno, uso un selector de jquery para precisar el último div .postHolder en la página, obtengo el ID y luego uso ese ID para obtener el micromensaje que viene después e inserto ese micromensaje después. . De esta manera, cuando se elimina un mensaje, se agrega uno automáticamente.

Si el usuario se desplaza para cargar más mensajes, no falta ninguno. He visto algunos Railscasts y veo a Ryan Bates hacer cosas similares con el uso de atributos de datos y he leído algunas cosas sobre ellos y parece que tengo la impresión de que esto es una mala práctica.

He tratado de pensar en otras formas de hacer esto, pero no puedo pensar en ninguna, pero hacerlo de esta manera se siente un poco extraño. Tal vez todo esté en mi cabeza, pero me gustaría otra solución mejor si es posible.

Muchas Gracias

saludos cordiales

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

1 Respuestas

Puede usar una variable para realizar un seguimiento de la cantidad de micromensajes en la página actual. Cada vez que elimine una publicación, disminuya esta variable. Cada vez que obtenga una nueva página de publicaciones, restablezca esta variable a su valor predeterminado (de 10).

Cuando obtenga 10 publicaciones nuevas, la compensación para la base de datos será (suponiendo que solicite la página 3 de micropublicaciones y haya eliminado 4 de la página dos)

(3 * 10) - (4) == 26

El primer micromensaje en la página 3 ahora será el ID de micromensaje 26

¡Asumiendo que he entendido tu pregunta, eso es!

contestado el 23 de mayo de 12 a las 10:05

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