2012-01-26 17 views
8

पर प्रतिक्रिया देने के लिए "रेंडर: अपडेट" से AJAX हैंडलिंग बदल रहा है मैं पुराने रेल ऐप को 3.1 में अपग्रेड कर रहा हूं। ऐप काफी काम कर रहा है, लेकिन मेरे पास कुछ AJAX कार्यक्षमता है जिसे मुझे अपडेट करने की आवश्यकता है। (यदि यह कोई फर्क पड़ता है तो मैं jquery और coffeescript का उपयोग कर रहा हूं)रेल 3.1 तक अपग्रेड -

सभी मौजूदा AJAX कार्यक्षमता रेंडर: अपडेट का उपयोग करके लिखी गई थी। उदाहरण के लिए

render :update do |page| 
    page.remove "financial_tran_offset_#{params[:ftof_id]}" 
    page.replace_html 'details', :partial => 'details', :locals => {:obj => @fire} 
end 

मुझे लगता है कि ऐसा करने का नया पसंदीदा तरीका answer_to का उपयोग करना है? जेएस को संभालने के लिए ब्लॉक, लेकिन मुझे इन विभिन्न मामलों को संभालने का सबसे अच्छा तरीका सुनिश्चित नहीं है।

पहला मामला (page.remove) मैं संपत्ति पाइप लाइन के साथ लगता है के लिए, मैं एक बाहरी जे एस होना चाहिए/ऐप्स/आस्तियों/javascripts/(जैसे page.remove) जावास्क्रिप्ट पक्ष को संभालने के लिए में, लेकिन मैं कर रहा हूँ सुनिश्चित नहीं है कि जेएस फ़ाइल में पैरामीटर कैसे पास करें। मुझे लगता है कि आप कुछ ऐसा कर सकते हैं:

respond_to do |format| 
    format.js {:render :js => {:ftof => params[:ftof_id]} 
end 

लेकिन मुझे यकीन नहीं है कि आप इसे जेएस फ़ाइल के अंदर से कैसे उठा सकते हैं। जेएस को जानकारी पास करने का यह सही तरीका है? या क्या कोई और तरीका है जिसका उपयोग करना चाहिए?

दूसरे मामले के लिए (page.replace_html) मुझे लगता है कि इसे 3.1 से हटा दिया गया है/हटा दिया गया है (apidock के अनुसार)। मुझे फिर से संदेह है कि यह ऐप/संपत्ति/जावास्क्रिप्ट निर्देशिका में जेएस फ़ाइल का उपयोग करना चाहिए, लेकिन यह सुनिश्चित नहीं है कि मुझे आंशिक रूप से प्रस्तुत करने और जेएस में इस जानकारी को पास करने के बारे में कैसे जाना चाहिए।

इस क्षेत्र में किसी भी संकेत दिए गए के लिए धन्यवाद =)

उत्तर

31

उपयोग js.erb विचारों और respond_to ब्लॉक के साथ संयोजन के रूप में jQuery।

जो कुछ भी इस कार्रवाई है (हम उदाहरण के लिए FoosController#update कहूँगा):

render :update do |page| 
    page.remove "financial_tran_offset_#{params[:ftof_id]}" 
    page.replace_html 'details', :partial => 'details', :locals => {:obj => @fire} 
end 

बन जाएगा:

respond_to do |format| 
    format.html 
    format.js  # <- this is what we're after 
end 

एक दृश्य फ़ाइल update.js.erb साथ:

$('#financial_tran_offset_<%= params[:ftof_id] %>').remove(); 
$('#details').replaceWith('<%= escape_javascript(render(:partial => 'details', :locals => {:obj => @fire})) %>'); 

update.js.erb को ईआरबी द्वारा पार्स किया जाएगा, जेएस के रूप में प्रस्तुत किया गया, क्लाइंट को वापस भेजा गया अजाक्स के माध्यम से टी और eval'd।

आप इन जेएस टेम्पलेट्स को जो कुछ भी चाहते हैं उसे पास कर सकते हैं। आखिरकार, वे ईआरबी फाइलें हैं। <%= %> और इंस्टेंस वैरिएबल का उपयोग करें जैसे आप एचटीएमएल/ईआरबी विचारों के साथ करेंगे। यदि आप अपने जेएस/ईआरबी विचारों में render पर कॉल करते हैं, तो HTML को सही ढंग से प्रस्तुत करने के लिए इसे escape_javascript से लपेटें।


render :update कॉल प्रोटोटाइप के लिए वर्ष JavaScriptGenerator सहायक तरीकों। JQuery में रूपांतरण बहुत आसान है क्योंकि वे दोनों एक ही काम करते हैं: एक डोम तत्व का चयन करें और इसे कुशलतापूर्वक उपयोग करें।

सामान्य मैनिप्लेशंस के साथ यहां एक अच्छी छोटी अनुवाद तालिका है।नियंत्रक से प्रोटोटाइप सहायक तरीकों निकालें, और एक इसी जे एस/ERB ध्यान में रखते हुए उनके jQuery या जे एस समकक्ष जगह:

 Prototype       jQuery/Javascript 
    in controller     in JS/ERb view (xxxxxx.js.erb) 
     ---------       ----------------- 
page.alert "message"     alert('message'); 
page.hide "id"      $('#id').hide(); 
page.insert_html \ 
     :top, "id", "content" $('#id').prepend('content'); 
     :bottom, "id", "content" $('#id').append('content'); 
     :before, "id", "content" $('#id').before('content'); 
     :after, "id", "content" $('#id').after('content'); 
page.redirect_to "url"    window.location.href = 'url'; 
page.reload       window.location.reload(); 
page.remove "id"      $('#id').remove(); 
page.replace "id", "content"   $('#id').replaceWith('content'); 
page.replace_html "id", "content" $('#id').html('content'); 
page.show "id"      $('#id').show(); 
page.toggle "id"      $('#id').toggle(); 

हर लाइन पर अपने अर्धविराम मत भूलना!

+0

ठंडा। क्या यह कॉफ़ीस्क्रिप्ट के साथ ऐसा करने के लिए है, या आप update.js.erb में सीधे जेएस तक ही सीमित हैं? –

+0

यदि आप वास्तव में कॉफीस्क्रिप्ट का उपयोग करना चाहते हैं, तो आप सक्षम हो सकते हैं, लेकिन गतिशील विचारों में समर्थन मैं जो कह सकता हूं उससे स्पॉटी है। (मैं व्यक्तिगत रूप से सीधे जेएस पसंद करता हूं।) सरल jQuery एक-लाइनर के लिए कॉफीस्क्रिप्ट थोड़ा अधिक है। '$ ('# id')। संलग्न करें ('सामग्री');' से '$ ('# id')। 'सामग्री' संलग्न करें। यह कोष्ठक के सेट को बचाने के लिए ओवरहेड के लायक नहीं है। JQuery कॉम्पैक्ट और काफी सरल है। इसके साथ रहना भी हो सकता है। – Substantial

+0

बहुत विस्तृत उत्तर के लिए धन्यवाद! –

संबंधित मुद्दे