5

मैं रेल 3.2.9 का उपयोग कर रहा हूं। जब मैं निर्देशिका में .js.coffee फ़ाइल में कॉफीस्क्रिप्ट कोड जोड़ता हूं, तो मुझे परिणामस्वरूप जावास्क्रिप्ट मेरे सभी वेबपृष्ठों में मिलता है। समस्या सभी जावास्क्रिप्ट में लपेटा जाता है है:कॉफीस्क्रिप्ट/जावास्क्रिप्ट कक्षाओं और रेल ऐप के बाकी हिस्सों के लिए उपलब्ध विधियों का सेट

(function() { 
    // my code 
}).call(this); 

इसलिए किसी भी तरीकों मैं परिभाषित किसी अन्य CoffeeScript कोड मैं अन्य फ़ाइलों में लिखने में दिखाई नहीं दे रहे हैं। पुन: प्रयोज्य कॉफीस्क्रिप्ट कक्षाओं और रेल के साथ तरीकों का एक सेट लिखने का सही तरीका क्या है?

उत्तर

7

अपनी सभी कक्षाओं को नाम देने के लिए सबसे आसान काम है। अपने आवेदन "एप्लिकेशन" फिर अपने प्रवर्तन कोड में कहा जाता है से पहले कुछ और होता है:

// Set up the namespace. 
window.app = { } 

और फिर अपने सभी .coffee फाइलों में:

class app.Pancakes 
    #... 

तो फिर तुम एक वैश्विक नाम स्थान है और आप चाहते हैं 'd कि नाम स्थान के माध्यम से सब कुछ संदर्भ:

pancakes = new app.Pancakes 
इसी तरह साधारण कार्यों के लिए

:

app.where_is = (pancakes, house) -> ... 

# And elsewhere... 
x = app.where_is(...) 

नामस्थान को आंशिक रूप से छिपाने और आंशिक रूप से छिपाने के कई तरीके हैं लेकिन वे उपरोक्त और सरल नेमस्पेसिंग पर सभी भिन्नताएं रेल संपत्ति परिसंपत्ति पाइपलाइन के साथ अच्छी तरह से खेलती हैं।

+0

नामस्थान सेट करने के लिए उचित जगह कहां है? application.js? लेआउट व्यू? –

+0

@at ​​.: कहीं भी जो हिट हो जाता है पहले करेगा। मुझे यकीन नहीं है कि यह 'application.js' मेनिफेस्ट फ़ाइल में टिकेगा लेकिन मुझे लगता है कि यह होगा। आप अपने बाकी स्क्रिप्ट टैग से पहले इसे अपने लेआउट में भी फेंक सकते हैं। –

+0

मैंने शुरुआत में '_' के साथ एक फ़ाइल बनाई, जैसे '_my_stuff.js.coffee'। इस तरह यह सबकुछ से पहले लोड हो गया है और मैं उस पर निर्भर करता हूं जो दूसरे कोड से पहले 'window.app = {}' सेट कर सकता है। –

4

इसके अलावा, आप इस तरह coffeescript फ़ाइलों के भीतर वर्गों को परिभाषित कर सकते हैं: कि रास्ते में

class this.Person 
    constructor: (attr = {}) -> 
    ... 

, परिभाषाओं ग्लोबल नेम स्पेस से जुड़े होते हैं।

+0

यह वह चीज है जिसे मैं खोज रहा था। मैं वास्तव में नाराज था कि कॉफ़ीस्क्रिप्ट के साथ मैं 'window.name = name' के साथ सबकुछ नाम दे रहा था। मैं आम तौर पर अधिकांश अनुप्रयोगों के लिए रेल 4+ का उपयोग करता हूं, इसलिए कॉफ़ीस्क्रिप्ट ज्यादातर मेरे लिए केक पर आइसिंग कर रहा है, और यह मेरा दिन बना देता है! –

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