2009-08-05 6 views
10

Tengo esto funcionando en su mayor parte. Mi enlace de rieles es:Los rieles destruyen confirman con Jquery AJAX

<%= link_to(image_tag('/images/bin.png', :alt => 'Remove'), @business, :class => 'delete', :confirm => 'Are you sure?', :id => 'trash') %> 

:class => "delete" está llamando a una función de ajax de modo que se elimina y la página no se actualiza que funciona muy bien. Pero debido a que la página no se actualiza, todavía está allí. Así que mi ID de basura está llamando esta función jQuery:

$('[id^=trash]').click(function(){ 
      var row = $(this).closest("tr").get(0); 
      $(row).hide(); 
      return false; 
}); 

¿Qué se esconde la fila de cualquier icono de la papelera hice clic en. Esto también funciona genial. Pensé que todo había funcionado y luego di con este problema. Cuando haces clic en mi papelera puedo hacer que aparezca este cuadro de confirmación para preguntarte si estás seguro. Independientemente de si elige cancelar o aceptar, el jquery se activa y oculta la fila. No se elimina, solo se oculta hasta que actualice la página. Traté de cambiarlo para que el aviso se realice a través de jquery, pero luego los rieles estaban borrando la fila independientemente de lo que elija en mi mensaje porque se llamaba a la función .destroy cuando se llamaba a la solicitud.

Mi pregunta es cómo puedo obtener el valor para cancelar o aceptar de la ventana emergente de confirmación de rieles para que en mi jquery pueda tener una instrucción if que se oculte si hacen clic en aceptar y no hace nada si hacen clic en cancelar.

EDITAR: Responder a la pregunta a continuación. Eso no funcionó. He intentado cambiar mi enlace a:

<%= link_to(image_tag('/images/bin.png', :alt => 'Remove'), @business, :class => "delete", :onclick => "trash") %> 

y poner esto en mi jQuery

function trash(){ 
if(confirm("Are you sure?")){ 
    var row = $(this).closest("tr").get(0); 
    $(row).hide(); 
    return false; 
} else { 
//they clicked no. 
} 
} 

Pero la función nunca fue llamado. Simplemente lo elimina sin aviso y no lo oculta. Pero eso me dio una idea.

Tomé la función de borrado que el Ajax estaba llamando

 $('a.delete').click (function(){ 
      $.post(this.href, {_method:'delete'}, null, "script"); 
      $(row).hide(); 
}); 

Y modificaron la implementación de su código:

eliminar :confirm => 'Are you sure?'

$('a.delete').click (function(){ 
     if(confirm("Are you sure?")){ 
      var row = $(this).closest("tr").get(0); 
      $.post(this.href, {_method:'delete'}, null, "script"); 
      $(row).hide(); 
      return false; 
     } else { 
      //they clicked no. 
      return false; 
     } 

}); 

¿Qué hace el truco.

Respuesta

3

Se puede quitar el:

:confirm => 'Are you sure?' 

y reemplazarlo con un evento personalizado onclick, así:

<%= link_to(image_tag('/images/bin.png', :alt => 'Remove'), @business, :class => 'delete', :onclick => 'someJSFunction', :id => 'trash') %> 

Luego, en sus application.js (o cualquier otro archivo JS), hacer:

function someJSFunction(){ 
    if(confirm("Are you sure?"){ 
    //they clicked yes. 
    } else { 
    //they clicked no. 
    } 
} 

lo siento, no tengo tiempo para probarlo ahora mismo, pero que debe trabajo.

+0

No funcionó pero me llevó a la respuesta. – Mike

+1

¡Entonces voto a favor por mi amabilidad! ;) –

12

eliminar: confirmar => '¿Estás seguro?'

$('a.delete').click (function(){ 
      if(confirm("Are you sure?")){ 
       var row = $(this).closest("tr").get(0); 
       $.post(this.href, {_method:'delete'}, null, "script"); 
       $(row).hide(); 
       return false; 
      } else { 
       //they clicked no. 
       return false; 
      } 

    }); 
5

Gracias chicos, he usado el siguiente tutorial para configurar jQuery con rieles:

http://www.notgeeklycorrect.com/english/2009/05/18/beginners-guide-to-jquery-ruby-on-rails/

cuando se utiliza junto con este tutorial, he utilizado el siguiente código:

 
Query.fn.deleteWithAjax = function() { 
    this.removeAttr('onclick'); 
    this.unbind('click', false); 
    this.click(function() { 
     if(confirm("Are you sure?")){ 
      $.delete_($(this).attr("href"), $(this).serialize(), null, "script"); 
      return false; 
     } else { 
      //they clicked no. 
      return false; 
     } 
    }) 
    return this; 
}; 
3

Tuve un problema similar pero después de leer este hilo eliminé la confirmación de mi botón e hice lo siguiente en jquery:

$('.delete_post').on('click', function(){ if(confirm("Are you sure?")){ $(this).closest('tr').delay().fadeOut(); } else{ return false; } });

y parece hacer el truco para mí. También agregué esto a mi acción de destrucción en el controlador:

respond_to do |format| 
    format.html { render :nothing => true } 
    format.json { head :no_content } 

P.S. No olvides agregar: remote => true al link_to

+1

¿Quiere decir: remote => cierto? – Galaxy

+0

Ah sí gracias – moon4e