2010-09-24 8 views
6

Mi borrar/destruir no está trabajando para Rails 3.eliminar/destruir no está funcionando en los carriles 3 con jQuery

No es para cualquier andamio o incluso para nuevos proyectos.

<%= link_to 'Destroy', card, :confirm => 'Are you sure?', :method => :delete %> 

De this question. La solución es la reinstalación de Firefox. Pero el mío tampoco está funcionando en cromo, safari u ópera.

código HTML generado: -

<a href="/categories/1" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a> 

PD: Por favor, no diga incluir archivos JS defecto o algo así. Porque no estoy interesado en el prototipo todos juntos, ya que estoy usando jQuery.

EDITAR/Actualizar, Importante: esta es la solución cuando no desea usar ningún tipo de prototipo. Estoy utilizando solo jQuery y los complementos respectivos en mi proyecto.

Las personas están respondiendo: primero incluya prototipos, etc. y luego instale alguna gema, etc. para eliminar conflictos entre el prototipo y jQuery. Eso es basura.

He publicado una respuesta. Por favor verifique eso una vez antes de ir por la opción. Trabajé para mí en más de 10 proyectos sin ningún problema. Todo lo que necesita hacer es:

Elimine todos los archivos js de su directorio javascript, excepto application.js. Luego pegue el código que especifiqué en mi respuesta en un nuevo archivo e incluya ese archivo. Incluya Jquery.js y luego todo está listo. No es necesario agregar javascript predeterminado (es decir, prototipo) u otra gema para eliminar conflictos, etc.

Respuesta

7

me encontré con el mismo problema tenía Mohit y también necesita incluir el 'discreto JavaScript Library' (o '') ujs en mis activos de JavaScript. En mis Rails actuales (v3.2.5), la biblioteca de UJS se proporcionará automáticamente.Esto se puede comprobar al ver la siguiente línea en su Gemfile:

gem 'jquery-rails'

y la siguiente línea en su aplicación/activos/javascript/application.js archivo:

//= require jquery_ujs

Como yo no sabía nada mejor, había eliminado la línea require jquery_ujs de mi propio archivo application.js, y me llevó un tiempo averiguar por qué mis llamadas link_to ..., :method => :delete ya no funcionaban.

Una vez que entendí el problema, fue fácil agregar las dos líneas anteriores a sus respectivos archivos y todo comenzó a funcionar como se esperaba de nuevo.

4

Asegúrese de incluir en su diseño los archivos Javascript predeterminados de Rails.

<%= javascript_include_tag :defaults %> 
+3

Por qué debería hacerlo, cuando estoy usando Jquery. Todavía para fines de prueba lo hice. Todavía no funciona. –

+0

Rails 3 utiliza javascript discreto para que funcione. Por lo tanto, debe incluir algún marco de JavaScript (Prototype o JQuery) y el apropiado 'rails.js' para él. Ver [el screencast de Ryan Bates] (http://railscasts.com/episodes/205-unobtrusive-javascript) para más información. –

+0

Esto no está bien .. Cuando algunos están dispuestos a usar Jquery por qué cargar el prototipo ... –

9

Si está usando jQuery no prototipo entonces es necesario agregar Jquery.rails.js en su proyecto lo demás cada vez que intenta eliminar cualquier cosa que le llevará a mostrar la página.

No recuerdo de dónde obtuve la solución y este archivo Jquery.rails.js. Pero seguro de alguna fuente confiable.

Aquí está el código para ese archivo. Puede ser que ayude a alguien.

jQuery(function ($) { 
    var csrf_token = $('meta[name=csrf-token]').attr('content'), 
     csrf_param = $('meta[name=csrf-param]').attr('content'); 

    $.fn.extend({ 
     /** 
     * Triggers a custom event on an element and returns the event result 
     * this is used to get around not being able to ensure callbacks are placed 
     * at the end of the chain. 
     * 
     * TODO: deprecate with jQuery 1.4.2 release, in favor of subscribing to our 
     *  own events and placing ourselves at the end of the chain. 
     */ 
     triggerAndReturn: function (name, data) { 
      var event = new $.Event(name); 
      this.trigger(event, data); 

      return event.result !== false; 
     }, 

     /** 
     * Handles execution of remote calls firing overridable events along the way 
     */ 
     callRemote: function() { 
      var el  = this, 
       data = el.is('form') ? el.serializeArray() : [], 
       method = el.attr('method') || el.attr('data-method') || 'GET', 
       url  = el.attr('action') || el.attr('href'); 

      if (url === undefined) { 
       throw "No URL specified for remote call (action or href must be present)."; 
      } else { 
       if (el.triggerAndReturn('ajax:before')) { 
        $.ajax({ 
         url: url, 
         data: data, 
         dataType: 'script', 
         type: method.toUpperCase(), 
         beforeSend: function (xhr) { 
          el.trigger('ajax:loading', xhr); 
         }, 
         success: function (data, status, xhr) { 
          el.trigger('ajax:success', [data, status, xhr]); 
         }, 
         complete: function (xhr) { 
          el.trigger('ajax:complete', xhr); 
         }, 
         error: function (xhr, status, error) { 
          el.trigger('ajax:failure', [xhr, status, error]); 
         } 
        }); 
       } 

       el.trigger('ajax:after'); 
      } 
     } 
    }); 

    /** 
    * confirmation handler 
    */ 
    $('a[data-confirm],input[data-confirm]').live('click', function() { 
     var el = $(this); 
     if (el.triggerAndReturn('confirm')) { 
      if (!confirm(el.attr('data-confirm'))) { 
       return false; 
      } 
     } 
    }); 


    /** 
    * remote handlers 
    */ 
    $('form[data-remote]').live('submit', function (e) { 
     $(this).callRemote(); 
     e.preventDefault(); 
    }); 
    $('a[data-remote],input[data-remote]').live('click', function (e) { 
     $(this).callRemote(); 
     e.preventDefault(); 
    }); 

    $('a[data-method]:not([data-remote])').live('click', function (e){ 
     var link = $(this), 
      href = link.attr('href'), 
      method = link.attr('data-method'), 
      form = $('<form method="post" action="'+href+'">'), 
      metadata_input = '<input name="_method" value="'+method+'" type="hidden" />'; 

     if (csrf_param != null && csrf_token != null) { 
      metadata_input += '<input name="'+csrf_param+'" value="'+csrf_token+'" type="hidden" />'; 
     } 

     form.hide() 
      .append(metadata_input) 
      .appendTo('body'); 

     e.preventDefault(); 
     form.submit(); 
    }); 

    /** 
    * disable-with handlers 
    */ 
    var disable_with_input_selector = 'input[data-disable-with]'; 
    var disable_with_form_selector = 'form[data-remote]:has(' + disable_with_input_selector + ')'; 

    $(disable_with_form_selector).live('ajax:before', function() { 
     $(this).find(disable_with_input_selector).each(function() { 
      var input = $(this); 
      input.data('enable-with', input.val()) 
       .attr('value', input.attr('data-disable-with')) 
       .attr('disabled', 'disabled'); 
     }); 
    }); 

    $(disable_with_form_selector).live('ajax:after', function() { 
     $(this).find(disable_with_input_selector).each(function() { 
      var input = $(this); 
      input.removeAttr('disabled') 
       .val(input.data('enable-with')); 
     }); 
    }); 
}); 

Actualización:

Puede obtener la última copia de Jquery.rails.js desde aquí.

https://raw.github.com/rails/jquery-ujs/master/src/rails.js 
+2

Esta no es la mejor manera de hacerlo si está utilizando la canalización de activos. La respuesta de Justin Houk es mejor si usa el inventario de activos. – Mab879

+0

@Justin houk la respuesta es mejor, bueno, no entiendo por qué esta respuesta es más alta que él. De todos modos, gracias Mab879 ahorras mis horas de tiempo y gracias yo Justin houk también – edisonthk

+1

@edisonthk porque la vez que publiqué esta respuesta. La gema Jquery-rails no fue lanzada. He cambiado la respuesta aceptada ahora ... –

2

Asegúrese de incluir en su diseño los archivos Javascript predeterminados de Rails.

<%= javascript_include_tag "application" %> 
+0

application.js es un archivo js en blanco: P Compruebe mi respuesta. –

Cuestiones relacionadas