2011-05-26 3 views
9

नई रेल 3.1 संपत्ति पाइपलाइन वास्तव में अच्छा है, लेकिन बाद से सभी CoffeeScript (या जावास्क्रिप्ट) फ़ाइलें है कि हर पेज में शामिल है एक एकल फाइल में नीचे melded हो, यह इस सवाल को जन्म देती है:आप किसी विशेष नियंत्रक और रेल 3.1 में कार्रवाई के लिए कॉफीस्क्रिप्ट (या जावास्क्रिप्ट) निष्पादन को कैसे सीमित करते हैं?

मैं निष्पादन कैसे को सीमित करते हैं मेरी स्क्रिप्ट का एक विशेष नियंत्रक या कार्रवाई के लिए? क्या मेरे कॉफीस्क्रिप्ट में यह जानने के लिए कोई तरीका है कि अनुरोध के दौरान कौन सा नियंत्रक और कार्रवाई का उपयोग किया गया था ताकि मैं अपनी लिपि में सशर्त बयान डाल सकूं?

या क्या मैं इसे गलत तरीके से पूरा कर रहा हूं?

+1

http: // stackoverf का संभावित डुप्लिकेट low.com/questions/6133235/rails-3-1-rc1-javascript-and-asset-pipeline; वहां मेरा जवाब देखें। –

+0

धन्यवाद ट्रेवर; किसी तत्व की उपस्थिति पर स्क्रिप्ट सशर्त बनाना या शरीर टैग पर एक विशेष सीएसएस वर्ग एक अच्छा दृष्टिकोण की तरह लगता है। – adamjcooper

उत्तर

0

क्यों इस नियंत्रक पर एक दृश्य के रूप में विशेष रूप से नियंत्रक के लिए जावास्क्रिप्ट डाल करने के लिए नहीं है (जैसा कि वे वहाँ अनुरूप अगर तो विशिष्ट कर रहे हैं)?

यदि वे सामान्य हैं तो आप कक्षाओं, आईडी या डेटा (एचटीएमएल 5) के साथ अपने विचार को चिह्नित कर सकते हैं और अपने जावास्क्रिप्ट को इसके लिए देख सकते हैं (ताकि आप अपना कोड पुन: उपयोग कर सकें)।

+0

यह एक अच्छा सवाल है, और यह मुझे अपने असली मुद्दे को समझने में मदद करता है। कॉफीस्क्रिप्ट का उपयोग करने के बाद मैं वास्तव में क्या कर रहा हूं, और मेरी समझ यह है कि यह केवल (स्वचालित रूप से) संपत्ति पाइपलाइन के माध्यम से उपलब्ध है। दूसरे शब्दों में, मुझे कुछ विशिष्ट नियंत्रक/क्रिया के लिए कुछ कॉफीस्क्रिप्ट चाहिए, लेकिन कॉफीस्क्रिप्ट का उपयोग करने का एकमात्र तरीका यह है कि संपत्ति पाइपलाइन के माध्यम से प्रत्येक पृष्ठ के लिए स्क्रिप्ट शामिल होगी। – adamjcooper

8

Trevor Burnham जवाब इस सवाल का अच्छी तरह से यहाँ: How do I associate a CoffeeScript file with a view?

वह कहता है:

वहाँ दो आम तरीके हैं: एक विशेष तत्व की उपस्थिति पर

  1. मेक व्यवहार सशर्त। उदाहरण के लिए, कोड

    if $('#signup').length > 0

  2. मेक व्यवहार body तत्व पर एक वर्ग पर सशर्त तरह एक साइनअप चादर कुछ के साथ आरंभ किया जाना चाहिए चलाने के लिए। आप ईआरबी का उपयोग कर बॉडी क्लास सेट कर सकते हैं। यह अक्सर स्टाइलशीट के लिए के रूप में वांछनीय है। कोड

    if $('body').hasClass 'user'

और अगर आप CoffeeScript में रुचि रखते हैं, ट्रेवर एक किताब है कि लग रहा है पर काम कर रहा है की तरह कुछ होगा बहुत अच्छा होने के लिए: http://pragprog.com/titles/tbcoffee/coffeescript

+2

समाधान 2 के लिए, आप https://github.com/tonytonyjan/gistyle आज़मा सकते हैं जो आपके उपयोग के लिए सम्मेलनों को सेट करता है। – lulalala

0

क्या मैं सामान्य रूप से क्या उपज है: जेएस मेरे लेआउट में जावास्क्रिप्ट के तहत और जब मुझे एक विशिष्ट स्क्रिप्ट की आवश्यकता होती है, तो मैं इसे सीधे अपने दृश्य से लोड करता हूं:

content_for :js do 
    javascript_include_tag "myscript" 
end 
1

किसी विशेष दृश्य में कॉफ़ीस्क्रिप्ट को प्रतिबंधित करने का एक तरीका है जावास्क्रिप्ट के लिए कस्टम स्पॉकेट फ़ाइल बनाना, जैसा कि application.js के प्रारूप में समान है। मान लें कि आप इसे extras.js कहते हैं।

// = my_code.js की आवश्यकता है।कॉफी

फिर javascript_include_tag "extras" का उपयोग विचारों आप चाहते हैं कि कोड को शामिल करने, या तो उन दृश्यों के लिए एक कस्टम लेआउट बनाने के द्वारा, या content_for() का उपयोग करके

Btw, अपने प्रश्न ने कहा कि रेल पाइपलाइन बलों आप अपनी सभी जेएस संपत्तियों को एक फाइल में डाल सकते हैं। यह सच नहीं है। यह अक्सर कई राउंड ट्रिप से बचने के लिए कुशल है, लेकिन आपके पास एकाधिक स्पॉकेट फाइलें हो सकती हैं।

0

आप कॉफी लिपि में अपने वार्स के लिए gon मणि का उपयोग कर रहे हैं, तो आप इस पैटर्न का उपयोग कर सकते हैं:

नियंत्रक में हर कार्रवाई के लिए एक झंडा रखो:

def index 
    @gps_coords = GpsCoord.all 

    # Flag for the CoffeeScript to decide which part to run 
    gon.index = true; 
    end 

    def show 
    @gps_coord = GpsCoord.find(params[:id]) 

    gon.lat = @gps_coord.latitude 
    gon.lon = @gps_coord.longitude 

    gon.show = true; 
    end 

सम्बंधित कॉफी में स्क्रिप्ट उन कार्यों के बीच विचलन करने के लिए उन झंडे का उपयोग करें:

# index action? 
    if gon.index? 
    first_coord = gon.gps_coords[0] 
    map.setView([first_coord.latitude, first_coord.longitude], 15); 

    # show action? 
    if gon.show? 
    map.setView([gon.lat, gon.lon], 15); 
संबंधित मुद्दे