2012-02-23 13 views
5

La aplicación permite a los usuarios votar en videos incrustados. Cuando los usuarios hacen clic en las flechas hacia arriba y hacia abajo, toda la página se actualiza para actualizar points. He estado intentando implementar la votación AJAX durante meses. Me gustaría la solución más directa que pueda ofrecer, incluso si no es la más eficiente. ¿Algunas ideas?Actualización de elementos en rieles con Ajax

Mis up y down acciones de app/controllers/links_controller

.... 

    def up 
    @link = Link.find(params[:id]) 
    @link.update_attribute :points, @link.points + 1 
    redirect_to :back 
    end 

    def down 
    @link = Link.find(params[:id]) 
    @link.update_attribute :points, @link.points - 1 
    redirect_to :back 
    end 

    .... 

Una versión minimalista de links_list, un parcial de app/views/links/_links_list, que se renderiza en otros puntos de vista utilizando varios métodos de clasificación

<% @links.each do |link| %> 
     <div class="row"> 
      <div class="span2"> 
       <%= link_to (image_tag ("up.png")), up_link_url(link), :method => :put %> 
       <%= link.points %> 
       <%= link_to (image_tag ("down.png")), down_link_url(link), :method => :put %> 
      </div> 
      <div class="span8"> 
       <%= link_to strip_tags(link.title), link %> 
      </div> 
     </div> 
    <% end %> 
  • lo haría desea lograr esto sin el uso de una gema externa, la aplicación ya está en producción
  • Probablemente he visto y probado la mayoría de los rails 3 tutoriales relacionados con ajax y rieles. Si publica un enlace a un tutorial, sugiera mods que deberían tener lugar para que funcione.
  • estoy carriles de rodadura 3.1

Gracias de antemano por cualquier comentario o sugerencias!

Respuesta

10

Ajax es bastante fácil de usar en Rails 3.1. En esta publicación se supone que está utilizando jQuery como su controlador JavaScript; si no lo eres, necesitarás instalar la gema jquery-rails, pero incluso para una aplicación en producción agregar una pequeña gema no debería ser un gran problema.

Su controlador va a terminar con este aspecto:

.... 

def up 
    @link = Link.find(params[:id]) 
    @link.update_attribute :points, @link.points + 1 
    respond_to do |format| 
    format.html {redirect_to :back} 
    format.js 
    end 
end 

def down 
    @link = Link.find(params[:id]) 
    @link.update_attribute :points, @link.points - 1 
    respond_to do |format| 
    format.html {redirect_to :back} 
    format.js 
    end 
end 

.... 

El cambio de vista será bastante pequeña:

<% @links.each do |link| %> 
    <div class="row"> 
    <div class="span2"> 
     <%= link_to (image_tag ("up.png")), up_link_url(link), :method => :put, :remote => true %> 
     <%= link.points %> 
     <%= link_to (image_tag ("down.png")), down_link_url(link), :method => :put, :remote => true %> 
    </div> 
    <div class="span8"> 
     <%= link_to strip_tags(link.title), link %> 
    </div> 
    </div> 

y necesitará nuevos archivos, up.js.erb y down.js.erb, en su aplicación/vistas/enlaces/carpeta, que contiene el comando de JavaScript para actualizar su página:

$(".span2").html("This post has <%= @link.points %> points.") 

Si decides ir con Prototype o algo, el código se verá más o menos igual; el único cambio será el JavaScript que coloque en up.js.erb y down.js.erb, que debería ser Prototype-y en lugar de jQuery-y.

+0

Impresionante He estado buscando esto pero la solución siempre fue sobre CRUD básico ..... gracias ......... – Magnum

Cuestiones relacionadas