AJAX para actualizar micropost votaciones arriba / abajo parcial solo actualiza la publicación más reciente

Utilizando Rails 3, JRuby.

Quería incorporar una calificación de “votar arriba” y “votar abajo” para mi aplicación social de Rails, que permite a los usuarios esencialmente recibir y rechazar las publicaciones. Esto funcionó muy bien, sin embargo, se actualizó toda la página cada vez que se votó una publicación. Para resolver esto, quería implementar una actualización parcial que solo actualizaría esa puntuación de publicación en particular, dentro de la alimentación posterior.

Seguí mi patrón habitual para implementar la actualización parcial de AJAX, sin embargo, el resultado no es exactamente lo que tenía en mente. En lugar de actualizar la publicación que me gusta / no me gusta, actualiza la publicación más reciente con la nueva puntuación de la publicación que me gustó / no me gustó.

He identificado esto como un problema de actualización parcial, porque cuando actualizo toda la página de forma manual, cada publicación tiene su puntaje de Me gusta / no me gusta (incluido el que quería modificar). Creo que el problema tiene que ver con la forma en que mi página publica las publicaciones en la página mediante un “locking”. Mi problema es que no puedo averiguar cómo obtener el comportamiento deseado de actualizar correctamente el micropost que voté. Aquí está algo de mi código:

_micropost.html.erb (parcial)

 
Post <%= link_to ''.html_safe, '#', class: "comment_link pull-right"%> <%= link_to ''.html_safe, increment_micropost_path(mp.id), class: "comment_link pull-right", :remote => true%> <%= link_to ''.html_safe, decrement_micropost_path(mp.id), class: "comment_link pull-right", :remote => true %>
'microposts/rating', :locals => {:micro => mp} %>
(....)

_home.html.erb

 (....) 
'microposts/micropost', :locals => {:microposts => @microposts }, :remote => true %>
(....)

my _rating.html.erb parcial (el bit que muestra la información)

  

controlador (solo mostraré el método de incremento, ambos son casi idénticos

 #increments micropost rating by 1 def increment @micropost = Micropost.find(params[:id]) @increment = lambda { |micropost| micropost.update_attribute(:rating, micropost.rating.to_i + 1) } @increment.call @micropost respond_to do |format| format.html {redirect_to root_url} format.js end end 

y el correspondiente incremento.js.html

 $('#global').html(" 'microposts/rating', :locals => {:micro => @micropost} %>"); 

Mencioné anteriormente que la función de incremento / decremento real del micropost que funciona bien, simplemente está representando esta información usando AJAX que no se comporta como se esperaba. Cualquier idea, por favor comparta.

La razón es que tiene múltiples div#global en su código (debido a each bucle), por lo que el navegador solo reconocerá el primero. Cambie global de una identificación a una clase y luego debería funcionar. También agregaría un atributo data-num al div y le asignaría el id del objeto de la base de datos (no debe confundirse con el id HTML). Algo como esto:

 
<%= render :partial => 'microposts/rating', :locals => {:micro => mp} %>

Luego, en su increment.js.erb (creo que quiso decir que en lugar de .js.html …), cámbielo a:

 $('div.global[data-num="<%= @micropost.id %>"]').html("<%= escape_javascript render :partial => 'microposts/rating', :locals => {:micro => @micropost} %>"); 

De esa manera, el JavaScript siempre sabrá cuál actualizar porque se basa en la ID de la base de datos.