2012-06-24 37 views
6

ठीक है इसलिए मैंने रेल 3.1 में पेश की गई संपत्ति पाइपलाइन का उपयोग करने के लिए मेरा बहुमुखी ऐप बदल दिया है। अधिकांश भाग के लिए यह आश्चर्यजनक रूप से आसान रहा है और मुझे प्रीप्रोकैसिंग क्षमता से प्यार है जो आपको अपने सीएसएस/जेएस फाइलों में इनलाइन रूबी का उपयोग करने की अनुमति देता है। हालांकि, मैंने एक बड़ी समस्या में भाग लिया है, जो स्प्राकेट्स की शक्ति के बावजूद हल करने में मुश्किल लगता है। मेरा ऐप किसी भी स्किन्स (या "पहचान" के बजाए चलाया जा सकता है) जिसे रनटाइम पर चुना जाता है। यह "पहचान" पैरामीटर कैश निर्देशिका, डेटाबेस कनेक्शन, पथ देखें - और वास्तव में संपत्ति पथ जैसे सामान सेट करता है। जबकि सभी "पहचान" की अपनी स्टाइलशीट हो सकती है, वहां एक साझा भी होता है जिसका उपयोग सभी मामलों में किया जाता है।रेल संपत्ति परिसंपत्ति पाइपलाइन - परिसंपत्ति पथ में संपत्ति कैसे शामिल नहीं है?

/app/assets/stylesheets/aplication.css.erb में:: तो संपत्ति फ़ोल्डर संरचना कुछ इस तरह दिखता

<% require_asset("shared.css") %> 
<% require_asset("overrides.css") %> 

यह दो स्टाइलशीट लोड करता है, और महत्वपूर्ण बात यह हल करने के लिए कॉन्फ़िगर संपत्ति रास्तों का उपयोग करता है उन्हें (इसलिए मैं मानक require और include निर्देशों के बजाय require_assets का उपयोग करता हूं, क्योंकि वे रिज़ॉल्वर को नहीं मारते हैं)। यह पाया गया पहला मैच देता है और मुझे भाग या पूरे स्टाइल के पूरे ओवरराइड को आसानी से ओवरराइड करने की अनुमति देता है। तो

/app/assets/stylesheets/shared.css 

उदाहरण संपत्ति फ़ोल्डर

/app/assets/[identity]/stylesheets/shared.css 

में एक ही नाम के साथ एक फ़ाइल डालकर अधिरोहित जा सकता है और अगर ऐसी कोई फ़ाइल मौजूद है यह चुपचाप वापस डिफ़ॉल्ट shared.css पर गिर जाता है।

यह सब शानदार ढंग से काम करता है - मैं जावास्क्रिप्ट, छवियों और फोंट के लिए एक ही तकनीक का उपयोग करता हूं और सब कुछ प्रीकंपिलेशन के दौरान अच्छी तरह से संसाधित और पैक किया जाता है। परंतु। एक प्रकार का (किनारे) विरासत है जिसे मैं प्राप्त करने में असमर्थ हूं;

संपत्ति: कभी कभी एक पहचान के लिए त्वचा तो एक और एक है कि केवल कुछ ही dosen लाइनों अलग करने के लिए इसी तरह की है (उदाहरण के लिए समान लेआउट लेकिन एक अलग रंग योजना के साथ) और मैं वास्तव में इस तरह कुछ करने के लिए सक्षम होना चाहते हैं /stylesheets/application.css.erb:

<% require_asset("shared.css") %> 
<% require_asset("overrides.css") %> 

संपत्ति/current_identity/स्टाइलशीट/overrides.css:

<% require_asset("../../some_other_identity/stylesheets/overrides.css") %> 
/* followed by the dosen or so lines that differ for this skin */ 
... 

यह विफल रहता है, क्योंकि वर्तमान संदर्भ "some_other_identity" में संपत्ति पथ में नहीं है एस - रेल को देव मोड में फ़ाइल नहीं मिलती है, और निश्चित रूप से इसे प्रीकंपिलेशन के दौरान भी शामिल नहीं किया जाता है। और यदि मैं इसे संपत्ति पथ में शामिल करता हूं तो यह गलत ओवरराइड.css लोड करता है (केवल एक हो सकता है)। इसलिए मैं overrides.css के शीर्ष पर कुछ इस तरह डालने के साथ प्रयोग किया गया है:

<%= File.read(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css")) %> 
/* rest of CSS */ 
... 

और वास्तव में है कि उम्मीद बस के रूप में काम करता है। परंतु। क्योंकि अब मैं सभी संपत्तियों की सेवा के लिए संपत्ति पाइपलाइन का उपयोग कर रहा हूं, अब मैं एक निश्चित पथ के साथ सीएसएस में छवियों का संदर्भ नहीं दे सकता - मुझे <%= asset_path("some_image.png") %> का उपयोग करना है ताकि पथ रिज़ॉल्वर अपने जादू को काम कर सके। इसका मतलब है कि मेरा overrides.css वास्तव में overrides.css.erb है, और निश्चित रूप से जब आप File.read() करते हैं तो ईआरबी प्रीप्रोसेसिंग नहीं होता है। तो, मैं अटक गया हूँ! मदद! किसी को?

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

<%= ERB.new(File.read(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css.erb"))).result %> 

यह ERB पार्स करने के लिए कोशिश करता है, लेकिन मैं

undefined method `asset_path' for main:Object 

मिलता जो निश्चित रूप से फ़ाइल मैं में asset_path("some_image.png") आदि का उपयोग कर मुझे की वजह से है मैं शामिल करने की कोशिश कर रहा हूँ।

+0

मैंने सोचा कि शायद 'फ़ाइल.read()' सीएसएस फ़ाइल नाम में .erb एक्सटेंशन जोड़ना इसे हल करेगा (चूंकि इसे एक फ़ाइल में शामिल किया जा रहा है जो एक .erb फ़ाइल भी है) लेकिन यह इतना आसान नहीं है, है ना? –

+0

और 'रेंडर()' का उपयोग करना संभव नहीं है - [इस प्रश्न को देखें] (http://stackoverflow.com/questions/8370399/rails-js-erb-file-cannot-find-method-render) –

उत्तर

5

ठीक है, खोज के घंटे के बाद मैं the list of available helper methods in Sprockets पर आया था - यह मुझे बहुत समय बचा लिया है | इस लिए the Sprockets man page GitHub पर से जोड़ दिया गया था (वहाँ एक कड़ी है, लेकिन यह #FIXME को इंगित करता है)। Sprockets एपीआई डॉक्स से:

  • (Object) evaluate(path, options = {})
  • path पढ़ता है और फाइल पर प्रोसेसर से चलता है।
  • यह आपको किसी संपत्ति के परिणाम को कैप्चर करने और इसे सीधे किसी अन्य में शामिल करने की अनुमति देता है।
  • <%= evaluate "bar.js" %>

बिंगो! मैं अपने को निर्देश शामिल हैं बदल दिया है:

<%= evaluate(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css.erb")) %> 

और सीएसएस संसाधित हो जाता है और परिणाम डाला, अभी जिस तरह मैं यह काम करना चाहता था।

+0

धन्यवाद संदर्भ के लिए, मेरी मदद की। –