2010-09-24 14 views
6

mio delete/distruggere non sta funzionando per Rails 3.Cancellare/Distruggere non funziona in Rails 3 con jQuery

Non per qualsiasi impalcatura o anche per i nuovi progetti.

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

Da this question. La soluzione è reinstalation di Firefox. Ma il mio non funziona anche in chrome, safari o opera.

codice HTML generato: -

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

PS: Si prega di non dire includere file JS predefiniti o qualcosa del genere. Perché non sono interessato al prototipo tutti insieme, visto che sto usando jQuery.

MODIFICA/Aggiornamento, Importante: questa è la soluzione quando non si desidera utilizzare il prototipo. Sto usando solo jQuery e rispettivi plugin nel mio progetto.

Le persone stanno rispondendo: in primo luogo includere il prototipo ecc. E quindi installare qualche gemma ecc. Per rimuovere i conflitti tra il prototipo e jQuery. Questa è spazzatura.

Ho inviato una risposta. Si prega di verificare che una volta prima di andare per l'opzione. Ha lavorato per me per più di 10 progetti senza problemi. Tutto quello che devi fare è:

Rimuovere tutti i file js dalla tua directory javascript tranne application.js. Quindi incolla il codice che ho specificato nella mia risposta in un nuovo file e includi quel file. Includi Jquery.js e poi tutto è pronto. Non è necessario aggiungere javascript predefinito (es .: prototipo) o qualche altro gioiello per rimuovere i conflitti ecc.

risposta

7

Ho incontrato lo stesso problema Mohit aveva e anche per includere il 'discreto JavaScript Library' (o 'UJS') nel mio patrimonio JavaScript. Nel mio attuale Rails (v3.2.5), la libreria UJS verrà fornita automaticamente.È possibile verificare questo vedendo la seguente riga nel vostro Gemfile:

gem 'jquery-rails'

e la seguente riga nel vostro app/beni/javascript/application.js del file:

//= require jquery_ujs

Da quando ho non sapevo niente di meglio, avevo rimosso la linea require jquery_ujs dal mio file application.js, e mi ci è voluto un po 'per capire perché le mie chiamate link_to ..., :method => :delete non funzionassero più!

Una volta compreso il problema, è stato semplice aggiungere le due righe precedenti ai rispettivi file e tutto ha funzionato come previsto.

4

Assicurarsi di includere file javascript Rails predefiniti nel layout.

<%= javascript_include_tag :defaults %> 
+3

Perché dovrei, quando sto usando Jquery. Ancora a scopo di test l'ho fatto. Ancora non funziona. –

+0

Rails 3 utilizza javascript discreto per farlo funzionare. Quindi devi includere alcuni framework javascript (Prototype o JQuery) e il corretto 'rails.js' per questo. Vedi [lo screencast di Ryan Bates] (http://railscasts.com/episodes/205-unobtrusive-javascript) per maggiori informazioni. –

+0

Questo non è giusto .. Quando alcuni sono disposti ad usare Jquery perché caricare il prototipo .. –

9

Se siete utilizzando jQuery non prototipo allora avete bisogno di aggiungere Jquery.rails.js nel progetto altrimenti ogni volta che si tenta di eliminare tutto ciò che vi porterà a mostrare pagina.

Non ricordo da dove ho trovato la soluzione e questo file Jquery.rails.js. Ma sicuro da qualche fonte affidabile.

Ecco il codice per quel file. Potrebbe essere aiutare qualcuno.

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')); 
     }); 
    }); 
}); 

Aggiornamento:

È possibile ottenere copia più recente di Jquery.rails.js da qui.

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

Questo non è il modo migliore per utilizzare questa pipeline. La risposta di Justin Houk è migliore se si utilizza la pipeline di asset. – Mab879

+0

@Justin risposta houk è meglio, beh non capisco perché questa risposta è più alta di lui. Comunque, grazie Mab879 risparmi le mie ore di tempo e grazie anche a te Justin Houk – edisonthk

+1

@edisonthk causa l'ora in cui ho postato questa risposta. La gemma di Jquery-rails non è stata rilasciata. Ho cambiato la risposta accettata ora .. –

2

Assicurarsi di includere file javascript Rails predefiniti nel layout.

<%= javascript_include_tag "application" %> 
+0

application.js è un file js vuoto: P Controlla la mia risposta. –