2011-04-08 13 views
9

रुबी में नई चीजों की कोशिश करना - प्रत्येक पृष्ठ पर मैं jquery के साथ बहुत समृद्ध सामान कर रहा हूं। जाहिर है अगर मैं सभी jquery application.js में डालता हूं तो यह बहुत तेज़ी से बढ़ने जा रहा है।रेल में प्रति पृष्ठ जावास्क्रिप्ट को लागू करने का एक अच्छा तरीका क्या है?

क्या यह अंत में एक पेज-विशिष्ट जेएस फ़ाइल आलसी लोड करने के लिए एक अच्छा तरीका है? उदाहरण:

<script> 

$(document).ready(function() { 

    $.getScript("/javascripts/this_pages_scripts.js"); 

}); 
</script> 

क्या ऐसा करने का कोई रेलवे तरीका है? मुझे new.js.erb आदि फ़ाइलों और यूजे के बारे में पता है, लेकिन मैं अभी भी अधिक पेज-विशिष्ट जेएस के बारे में बात कर रहा हूं - आप जानते हैं, शुरुआती, ड्रैग निर्माता, आदि को खींचें और छोड़ें

बहुत बहुत धन्यवाद।

+1

जब आप "बहुत तेज़ी से" कहते हैं तो आप अतिरंजित हो सकते हैं। जावास्क्रिप्ट का 20-30KB बहुत है, फिर भी यह "बड़ा" नहीं है क्योंकि इसे लगभग 3KB तक संपीड़ित ब्राउज़र पर भेज दिया जा सकता है और यदि आपका सर्वर ठीक से कॉन्फ़िगर किया गया है तो अनुरोधों के बीच कैश किया जाएगा। यह केवल jQuery-UI या Google मानचित्र जैसी बड़ी लाइब्रेरी है जो आपको चिंता करनी चाहिए, और उन पृष्ठों पर लोड नहीं करना जो उनका उपयोग नहीं कर सकते हैं। – tadman

उत्तर

11

दो तरीके है कि मैं का उपयोग कर रहे हैं:

छोटे, तुच्छ लिपियों कि सिर्फ आंख कैंडी का एक सा जोड़ रहे हैं के लिए, मैं अक्सर शामिल उन्हें इनलाइन टेम्पलेट में वे संशोधित (आप दिखाया है बस की तरह) , क्योंकि इस तरह से ट्रैक रखना मेरे लिए आसान है।

कुछ भी एक से अधिक या दो छोटे लाइनों है कि मैं इसे विनीत रखने के लिए, लेकिन इसे लोड का उपयोग कर के लिए content_for

मेरे आवेदन लेआउट इस (Haml में) की तरह दिखता है:

= javascript_include_tag 'jquery.144.min','rails','jquery.tools','application' 
= yield :scripts 

महत्वपूर्ण हिस्सा है yield :scripts। फिर एक पृष्ठ जहाँ मैं कुछ जावास्क्रिप्ट मैं क्या जरूरत है:

- content_for :scripts do 
    = javascript_include_tag 'photo_form' 

इस शीर्ष लेख में जावास्क्रिप्ट को लोड करता है, लेकिन दिए गए टेम्पलेट से पता चला है तभी। content_for संबंधित नाम के साथ yield विधि पर सामान भेजता है।

आप कहीं भी उपज ब्लॉक चिपक सकते हैं - मेरे पास बंद शरीर टैग से पहले भी एक है। उपज/content_for वास्तव में आसान है।

नोट्स में टिप्पणियों की ओर इशारा करते हुए नोट करें, जो कुछ भी सिर में लोड नहीं होना चाहिए पृष्ठ के अंत में लोड किया जाना चाहिए।

यदि आपके पास कुछ और जटिल है, तो आप अपने टेम्पलेट्स और अपने एप्लिकेशन व्यू के बीच इंस्टेंस चर का उपयोग कर सकते हैं। उदाहरण के लिए, मेरे ऐप में मेन्यूबार है जो एप्लिकेशन लेआउट में है। इसलिए, कभी-कभी मैं केवल कुछ पृष्ठों पर संदर्भ-विशिष्ट बटन या बटन की अतिरिक्त पंक्ति को ट्रिगर करना चाहता हूं।

अपने आवेदन लेआउट में मैं एक आंशिक जो मेनू renders फोन, मेनू कोड लगता है:

#menubar (normal menu stuff) 
    - if @special_menu 
    #special_menu 

तो, तो किसी भी टेम्पलेट में आप कर सकते हैं:

- @special_menu = true 

... और उस पृष्ठ के लिए दिया गया मेनू दिखाई देगा। आप इसे नियंत्रक क्रियाओं में भी कर सकते हैं, मेरे पास एक नियंत्रक है जहां मैंने फ़िल्टर से पहले एक जोड़ा जो मेनू फ्लैग में से एक को सत्य में सेट करता है। आप जावास्क्रिप्ट सामान के किसी भी जटिल सेट के लिए वही काम कर सकते हैं जिसे आप सशर्त रूप से शामिल करना चाहते हैं।

इन विचारों मैं इस railscast देखने से मिल के अधिकांश: http://railscasts.com/episodes/30-pretty-page-title

आप एक बार देख ले जाना चाहिए!

+0

जब भी संभव हो, पेज प्रतिपादन को पकड़ने से बचने के लिए दस्तावेज़ में जावास्क्रिप्ट फ़ाइलों को बहुत देर से लोड किया जाना चाहिए। उदाहरण के लिए, ' 'टैग बंद होने से पहले Analytics आखिरी बात होनी चाहिए। jQuery को शुरुआती कारणों से '$ (दस्तावेज़) .ready (...) 'का उपयोग करने वाले कुछ भी करने के लिए जल्दी लोड किया जाना चाहिए। – tadman

+0

अच्छी टिप्स ताडमैन, धन्यवाद! – Andrew

0

सेट प्रतीक अपने शीर्षक में फ़ाइल नाम का प्रतिनिधित्व करते हैं और नियंत्रक

@script = "prototype" 
ध्यान में रखते हुए फिर

में इसे कहते हैं:

<%= javascript_include_tag @script %> 

या लोड करने के लिए कई

@scripts = ["prototype", "dropdown"] 

फिर

<% @scripts.each do |s| %> 
    <%= javascript_include_tag s %> 
<% end &> 
+0

फिर इसे प्रत्येक नियंत्रक –

+0

में अलग करें, यह वास्तव में प्रश्नों के बड़े पैमाने पर जवाब नहीं देता है कि रेलवे सम्मेलन फाइलों में आपके जावास्क्रिप्ट को संरचित करने के लिए क्या है। और वैसे, आप एक ला 'js =% w {foo bar} तर्कों के लिए सरणी का विस्तार करने के लिए स्प्लट ऑपरेटर का उपयोग कर सकते हैं; javascript_include_tag * जेएस'। – coreyward

0

मैं व्यक्तिगत रूप से requireJS का उपयोग करता हूं और इसे संभालने के लिए एक कस्टम फीचर डिटेक्शन लाइब्रेरी का उपयोग करता हूं।

तब मेरे पास आवश्यक लेआउट/मास्टर/साझा दृश्य पृष्ठ में requjs स्क्रिप्ट और data-main विशेषता शामिल करने के लिए एक पंक्ति है। (मैं रेल के साथ इस तरह से परिचित नहीं हूं, लेकिन यह किसी भी अन्य एमवीसी के साथ समान है)।

मैंने कहीं और इस बारे में एक अच्छा जवाब लिखा है। आप इसे ढूंढने में सक्षम हो सकते हैं।

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

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