2010-12-09 15 views
7

Usando rails3 y el prototipo (rails.js)link_to remotas => true no actualizar con el Ajax

Tengo una simple lista de productos con editar y borrar enlaces como imágenes. Al eliminar un producto, la lista no se actualiza. Al actualizar la página, se muestra que el producto se ha eliminado.

/app/views/products/list.rhtml

<div id="product_list"> 
    <%= render :partial => 'list' %> 
</div> 

/app/views/products/_list.rhtml

<%= link_to image_tag("delete.png"), { :controller => 'products', :action => 'destroy', :id => product }, :method => :delete, :confirm => "Are you sure?", :remote => true %> 

/app/controllers/products.rb

def destroy 
    Product.find(params[:id]).destroy 
    @products = Product.all 
    end 

/app/views/products/destroy.rjs (no estoy seguro de qué hacer con eso ...)

$(document).ready(function() { 
    $("#product_list").html("<%= escape_javascript(render(:partial => "list")) %>"); 
}); 

Así que el enlace remoto parece funcionar bien. no estoy seguro de cómo utilizar la devolución de llamada Ajax para actualizar #product_list

traté de poner lo siguiente en la cabecera de la página:

$(document).ready(function(){ 
    $('#product_list').bind("ajax:success", function(evt, data, status, xhr){ 
     alert('hello'); 
    }) 
}); 

pero no es ejecutado (que probablemente no es válida código para el prototipo) y yo no sabría de todos modos qué código poner dentro para que mi lista se actualice después de destruir un producto

Cualquier ayuda (que no sea "use jQuery") es muy apreciada.

EDITAR: Aquí está el registro del servidor para la acción de eliminación (después moví el javascript arriba para destroy.js.erb)

Started POST "/products/destroy/3" for 127.0.0.1 at ..... 
Processing by ProductsController#destroy as JS 
Parameters: {"_"=>"", "id"=>"3"} 
[1m[36mProduct Load (0.0ms)[0m [1mSELECT `products`.* FROM `products` WHERE (`products`.`id` = 3) LIMIT 1[0m 
    [1m[35mSQL (0.0ms)[0m BEGIN 
    [1m[36mSQL (0.0ms)[0m [1mDELETE FROM `products` WHERE (`products`.`id` = 3)[0m 
    [1m[35mSQL (78.1ms)[0m COMMIT 
    [1m[36mProduct Load (0.0ms)[0m [1mSELECT `products`.* FROM `products`[0m 
Rendered products/destroy.js.erb within layouts/standard (31.2ms) 
Completed 200 OK in 312ms (Views: 62.5ms | ActiveRecord: 78.1ms) 

Procesamiento por ProductsController # destruir como JS que el control remoto enlace funciona

[36m Carga de producto (0.0ms) [0m [1mSELECCIONAR products. DE products * Los @products = Product.all se ejecuta

productos prestados/destroy.js.erb dentro de los diseños estándar/ la FIE Javascript se hace

Así que ahora supongo que es un problema con el javascript . código:

$ (document) html ready (function() {$ ("# product_list") ("<% = escape_javascript (render (: parcial => "" %))>" lista); });

¿Ese tipo de código es compatible con el prototipo? No uso jQuery ...

Respuesta

0

Hum ... Voy a intentar ayudarte.

¿Estás seguro después de hacer clic en el enlace eliminar, la solicitud se maneja como JS? Compruebe en el registro.

¿Se muestra el archivo "app/views/products/destroy.rjs"?

Rjs ya no existe en rails3. El nuevo nombre es UJS.

intenta cambiar el nombre del archivo a destroy.js. Haml {o} erb

¿Qué es mejor?

+1

Hola, puedes echar un vistazo a la edición anterior. Je ajax y js.erb son ejecutados y representados. Podría ser un problema con el código js –

22

encontrado la respuesta en mi propia:

/app/controllers/products.rb

def destroy 
    Product.find(params[:id]).destroy 
    @products = Product.all 
    respond_to do |format| 
     format.js { render :layout=>false } 
    end 
    end 

/app/views/products/destroy.js.erb

$("product_list").update("<%= escape_javascript(render(:partial => "list")) %>"); 

¿Por qué no hay ningún tutorial, ejemplo de código o algo claro sobre el ajax thingy en rails3? tuve que usar partes de código a partir de 5 blogs, foros y diferentes moldes, y mezclar todos juntos hasta encontrar la combinación correcta ... suspiro

+0

Estoy buscando un tutorial o un ejemplo también, pero no encontré nada útil en los sitios "oficiales" de los rieles. Voy a intentar con tu código ... – Klaus

+0

@repecmps ¿Quieres decir que la línea {render: layout => false} hizo el truco?Estaba teniendo el mismo problema y lo usé, pero no funcionó. Aquí hay un enlace a mi pregunta: http://stackoverflow.com/questions/11635711/ajax-call-not-working-in-ruby-on-rails. Ve si puedes ayudar a detectar lo que estoy haciendo mal. Gracias por tu tiempo – kabir

1

en líneas repecmps,

basta con insertar :content_type para representar parte de el contenido descargado, así:

format.js { render :layout=>false, :content_type => 'application/javascript' } 

con una parte completa de repecmps respuestas:

def destroy 
    Product.find(params[:id]).destroy 
    @products = Product.all 
    respond_to do |format| 
     format.js { render :layout=>false, :content_type => 'application/javascript' } 
    end 
end 

/app/views/products/destroy.js.erb:

$("product_list").html("<%= escape_javascript(render(:partial => "list")) %>"); 

y, encontré a this noche.

1

Creo que su acción de destruir está haciendo demasiado, ya que está destruyendo el producto y enumerando todos los productos. Se podría hacer algo como:

/app/controllers/products.rb

class ProductsController < ApplicationController 
    respond_to :html, :js 

    def destroy 
    @product_id = params[:id] 
    Product.find(@product_id).destroy 
    respond_with do |format| 
     format.html { redirect_to posts_path } 
    end 
    end 
end 

/app/views/products/destroy.js.erb

$("#product_<%= @product_id %>").remove() 

Mientras como su elemento de producto en el índice utiliza algo así como dom_id, he aquí un ejemplo:

<ul id="products"> 
    <% @products.each do |product| 
    <li id=<%= dom_id product %>>...</li> 
    <% end %> 
</ul> 

De esta manera su acción de destrucción solo destruirá el producto deseado, y si el cliente no tiene JS, recurrirá a la solicitud HTML que redirigirá al índice de productos que se actualizará en consecuencia.

Cuestiones relacionadas