2010-09-24 17 views
6

साथ रेल 3 में काम नहीं कर रहा मेरे हटाना रद्द करें/नष्ट रेल 3.हटाएं/नष्ट jQuery

किसी भी पाड़ के लिए या भी नहीं नई परियोजनाओं के लिए के लिए काम नहीं कर रहा।

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

this question से। समाधान फ़ायरफ़ॉक्स पुनर्स्थापन है। लेकिन मेरा क्रोम, सफारी या ओपेरा में भी काम नहीं कर रहा है।

एचटीएमएल कोड उत्पन्न: -

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

पुनश्च: कृपया नहीं कह रहे हैं डिफ़ॉल्ट जे एस फ़ाइलें या कुछ में शामिल हैं। क्योंकि मैं प्रोटोटाइप में सभी को एक साथ दिलचस्पी नहीं लेता, क्योंकि मैं jQuery का उपयोग कर रहा हूं।

संपादित/अद्यतन, महत्वपूर्ण: यह समाधान है जब आप प्रोटोटाइप का उपयोग नहीं करना चाहते हैं। मैं अपने प्रोजेक्ट में केवल jQuery और संबंधित प्लगइन का उपयोग कर रहा हूं।

लोग उत्तर दे रहे हैं: पहले प्रोटोटाइप इत्यादि शामिल करें और फिर प्रोटोटाइप और jQuery के बीच संघर्ष को हटाने के लिए कुछ मणि आदि इंस्टॉल करें। वह बकवास है।

मैंने एक उत्तर पोस्ट किया है। विकल्प के लिए जाने से पहले कृपया जांच लें। बिना किसी मुद्दे के 10 से अधिक परियोजनाओं के लिए मेरे लिए काम किया। आपको बस इतना करना है:

application.js को छोड़कर अपनी जावास्क्रिप्ट निर्देशिका से सभी जेएस फ़ाइलों को हटाएं। फिर मेरे उत्तर में निर्दिष्ट कोड को एक नई फ़ाइल में पेस्ट करें और उस फ़ाइल को शामिल करें। Jquery.js शामिल करें और फिर आप सभी सेट हैं। आपको विवादों को हटाने के लिए डिफ़ॉल्ट जावास्क्रिप्ट (यानी: प्रोटोटाइप) या कुछ अन्य मणि जोड़ने की आवश्यकता नहीं है।

उत्तर

7

मैं एक ही मुद्दा मोहित था में भाग है और यह भी मेरी जावास्क्रिप्ट संपत्ति में 'विनीत जावास्क्रिप्ट पुस्तकालय' (या 'ujs') शामिल करने के लिए की जरूरत है। मेरे वर्तमान रेल (v3.2.5) में, यूजेएस लाइब्रेरी स्वचालित रूप से प्रदान की जाएगी।

gem 'jquery-rails'

और अपने अनुप्रयोग/आस्तियों/javascripts/application.js फ़ाइल में निम्न पंक्ति:

//= require jquery_ujs

मैं के बाद से आप अपने Gemfile में निम्न पंक्ति को देखकर यह सत्यापित कर सकते हैं किसी भी बेहतर तरीके से नहीं पता था, मैंने अपनी खुद की application.js फ़ाइल से require jquery_ujs लाइन हटा दी थी, और मुझे यह पता लगाने में कुछ समय लगा कि मेरा link_to ..., :method => :delete कॉल अब और क्यों काम नहीं कर रहा था!

एक बार जब मैं समस्या को समझ गया, तो उपरोक्त दो पंक्तियों को अपनी संबंधित फाइलों में वापस जोड़ना आसान था और सब कुछ फिर से अपेक्षित काम करना शुरू कर दिया।

4

सुनिश्चित करें कि आप अपने लेआउट में डिफ़ॉल्ट रेल जावास्क्रिप्ट फ़ाइलों को शामिल करते हैं।

<%= javascript_include_tag :defaults %> 
+3

मुझे jquery का उपयोग क्यों करना चाहिए। अभी भी परीक्षण के उद्देश्य के लिए मैंने ऐसा किया। अभी भी कोई काम नहीं कर रहा है। –

+0

रेल 3 इसे काम करने के लिए अविभाज्य जावास्क्रिप्ट का उपयोग करता है। तो आपको इसके लिए कुछ जावास्क्रिप्ट ढांचे (प्रोटोटाइप या JQuery) और उचित 'rails.js' शामिल करना होगा। अधिक जानकारी के लिए [रयान बेट्स द्वारा स्क्रीनकास्ट] देखें (http://railscasts.com/episodes/205-unobtrusive-javascript)। –

+0

यह सही नहीं है .. जब कुछ प्रोटोटाइप लोड करने के लिए jquery का उपयोग करने के इच्छुक हैं .. –

9

आप उपयोग कर Jquery तो आप अपनी परियोजना के बाकी हर में Jquery.rails.js जोड़ने की जरूरत है आप कुछ भी हटाने का प्रयास प्रोटोटाइप नहीं हैं तो यह आपको लेने के लिए पेज को दिखाने के लिए होगा।

मुझे याद नहीं है कि मुझे समाधान कहाँ मिला और यह Jquery.rails.js फ़ाइल। लेकिन कुछ ट्रस्ट-सक्षम स्रोत से सुनिश्चित करें।

यहां उस फ़ाइल के लिए कोड है। किसी की मदद कर सकता है।

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

अद्यतन:

आप यहाँ से Jquery.rails.js की नवीनतम प्रति प्राप्त कर सकते हैं।

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

यदि आप संपत्ति पाइपलाइन का उपयोग कर रहे हैं तो यह सबसे अच्छा तरीका नहीं है। यदि आप संपत्ति पाइपलाइन का उपयोग करते हैं तो जस्टिन Houk उत्तर एक बेहतर है। – Mab879

+0

@ जस्टिन हॉक जवाब बेहतर है, अच्छी तरह से मुझे समझ में नहीं आता कि यह जवाब उसके बाद उच्च वोट क्यों है। वैसे भी, धन्यवाद मैब 879 आप मेरे घंटों का समय बचाते हैं और धन्यवाद जस्टिन होक भी – edisonthk

+1

@edisonthk उस समय को मैंने जवाब दिया था। Jquery-rails मणि जारी नहीं किया गया था। मैंने अब स्वीकार किए गए उत्तर को बदल दिया है .. –

2

सुनिश्चित करें कि आप अपने लेआउट में डिफ़ॉल्ट रेल जावास्क्रिप्ट फ़ाइलों को शामिल करते हैं।

<%= javascript_include_tag "application" %> 
+0

application.js एक खाली जेएस फ़ाइल है: पी मेरा उत्तर देखें। –