2010-09-24 2 views
6

Meine Lösch-/zerstören funktioniert nicht für Rails arbeiten 3.Löschen/Zerstören ist nicht in Schienen 3 mit jQuery

Nicht für jedes Gerüst oder auch für neue Projekte.

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

Von this question. Lösung ist Firefox Reinstalation. Aber meine arbeitet auch nicht in Chrom, Safari oder Oper.

HTML-Code generiert: -

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

PS: Bitte sagen Sie nicht enthalten Standard JS-Dateien oder so etwas. Weil ich mich überhaupt nicht für Prototypen interessiere, da ich jQuery benutze.

BEARBEITEN/Aktualisieren, Wichtig: Dies ist die Lösung, wenn Sie überhaupt keinen Prototyp verwenden möchten. Ich verwende nur jQuery und entsprechende Plugins in meinem Projekt.

Die Leute antworten: Zuerst Prototyp usw. und dann einige Juwel usw. installieren, um Konflikte zwischen Prototyp und jQuery zu entfernen. Das ist Müll.

Ich habe eine Antwort gepostet. Bitte überprüfen Sie dies einmal, bevor Sie sich für die Option entscheiden. Arbeitete für mich für mehr als 10 Projekte ohne irgendwelche Probleme. Alles, was Sie tun müssen, ist:

Entfernen Sie alle Js-Dateien aus Ihrem Javascript-Verzeichnis mit Ausnahme von application.js. Fügen Sie dann den Code, den ich in meiner Antwort angegeben habe, in eine neue Datei ein und fügen Sie diese ein. Fügen Sie Jquery.js ein und Sie sind fertig. Sie müssen kein Standardjavascript (zB: Prototyp) oder ein anderes Juwel hinzufügen, um Konflikte zu entfernen usw.

Antwort

7

Ich lief in das gleiche Problem Mohit hatte und auch die ‚Dezente JavaScript-Bibliothek‘, um damit benötigt (oder ‚UJS‘) in meinem JavaScript Vermögen. In meinem aktuellen Rails (v3.2.5) wird die UJS-Bibliothek automatisch zur Verfügung gestellt.Sie können dies überprüfen, indem Sie die folgende Zeile in Ihrem Gemfile sehen:

gem 'jquery-rails'

und die folgende Zeile in Ihre app/assets/Javascripts/application.js Datei:

//= require jquery_ujs

Da ich wusste ich nicht besser, ich hatte die Zeile aus meiner eigenen application.js Datei entfernt, und es dauerte eine Weile, um herauszufinden, warum meine link_to ..., :method => :delete Anrufe nicht mehr funktionierten!

Sobald ich das Problem verstanden hatte, war es einfach, die obigen zwei Zeilen zurück zu ihren jeweiligen Dateien hinzuzufügen und alles begann wieder wie erwartet zu arbeiten.

4

Stellen Sie sicher, dass Sie Standard-Rails-Javascript-Dateien in Ihr Layout einfügen.

<%= javascript_include_tag :defaults %> 
+3

Warum sollte ich, wenn ich Jquery verwende. Noch zu Testzwecken habe ich das gemacht. Es funktioniert immer noch nicht. –

+0

Rails 3 verwendet unaufdringliches JavaScript, um es zu funktionieren. Sie müssen also ein Javascript-Framework (Prototype oder JQuery) und ein richtiges 'rails.js' für Sie einfügen. Weitere Informationen finden Sie [Screencast von Ryan Bates] (http://railscasts.com/episodes/205-unobtrusive-javascript). –

+0

Dies ist nicht richtig .. Wenn einige Jquery verwenden möchten, warum Prototyp laden. –

9

Wenn Sie sind mit JQuery Prototyp nicht dann müssen Sie Jquery.rails.js in Ihrem Projekt sonst jedes Mal wenn Sie etwas zu löschen versuchen, hinzuzufügen, es wird Sie nehmen Seite zu zeigen.

Ich erinnere mich nicht, woher ich die Lösung und diese Jquery.rails.js Datei bekam. Aber sicher von einer vertrauenswürdigen Quelle.

Hier ist der Code für diese Datei. Vielleicht hilft es jemandem.

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

Update:

Sie können neueste Kopie von Jquery.rails.js von hier.

+2

Dies ist nicht der beste Weg, wenn Sie die Asset-Pipeline verwenden. Justin Houks Antwort ist eine bessere, wenn Sie die Asset-Pipeline verwenden. – Mab879

+0

@Justin Houk Antwort ist besser, nun verstehe ich nicht, warum diese Antwort höher ist, dann stimme ihn. Wie auch immer, danke Mab879 Sie sparen meine Stunden Zeit und danken Ihnen Justin Houk auch – edisonthk

+1

@edisonthk Ursache der Zeit, die ich diese Antwort gepostet. Jquery-Rails Juwel wurde nicht veröffentlicht. Ich habe die angenommene Antwort jetzt geändert .. –

2

Stellen Sie sicher, dass Sie Standard-Rails-Javascript-Dateien in Ihr Layout einfügen.

<%= javascript_include_tag "application" %> 
+0

application.js ist eine leere js-Datei: P Überprüfen Sie meine Antwort. –