13

Rails Asset Pipeline guide आपको config/application.rb में उपयोग करने के लिए निर्देश देता है लेकिन मुझे इस बिंदु पर अनुरोध के सबडोमेन तक पहुंच नहीं है।रेलवे 3.1 में वाइल्डकार्ड सबडोमेन के आधार पर स्प्राकेट्स में संपत्ति खोज पथ कैसे जोड़ूं?

मैं अनुरोध के सबडोमेन के आधार पर एक अतिरिक्त पथ (केवल वर्तमान अनुरोध के लिए) को प्रीपेड करने में सक्षम होना चाहता हूं।

मेरा आवेदन विशिष्ट विवरण

यह एक बुनियादी सीएमएस अनुप्रयोग है। रूट domain.com होस्ट मानक नियंत्रक/दृश्य प्रतिपादन और डिफ़ॉल्ट संपत्ति पथ के साथ व्यवस्थापकीय भाग को संभालता है।

subdomain.domain.com पर अनुरोध subdomain पर आधारित साइट को प्रस्तुत करता है। यह को before_filter में कॉल करता है और केवल वर्तमान अनुरोध के लिए Rails.root.join('vendor/sites/[subdomain]/templates') जोड़ता है।

मैं अनुरोध होस्ट [subdomain].domain.com पर स्प्राकेट्स खोज पथ पर Rails.root.join('vendor/sites/[subdomain]/assets') को प्रीपेड करने में सक्षम होना चाहता हूं।

संपादित

मैं Sprockets::Environment के लिए सिर्फ एक mixin में छोड़ने समाप्त हो गया है कि call विधि अधिलेखित कर देता है:

module SiteAssetsResolver 
    def call(env) 
    begin 
     # prepend path based on subdomain (from env) 
     super # Sprockets::Server#call 
    ensure 
     # remove path based on subdomain 
    end 
    end 
end 

MyApp::Application.assets.extend(SiteAssetsResolver) 
+1

संपत्ति पाइपलाइन वास्तव में उत्पादन में प्रत्येक अनुरोध को आपकी संपत्ति को संकलित करने के लिए नहीं है। यह विकास के लिए बहुत अच्छा है लेकिन आपको उन्हें उत्पादन के लिए स्थैतिक फाइलों में संकलित करना चाहिए। इस प्रकार आपको इसके लिए अपना सिस्टम विकसित करना होगा (शायद एक नियंत्रक जो सीएसएस फाइलों को सेवा देता है?) या अपने ऐप्स को अलग से बनाएं। – thomasfedb

उत्तर

1

आप अपना दृश्य पथ के लिए किया था बस के रूप में, फिल्टर से पहले एक जोड़ सकते हैं और संलग्न Rails.application.config.assets.paths के लिए नया रास्ता

मुझे यह विचार मिला Railscasts #279 Understanding the Asset Pipeline

+2

हम्म, बहुत यकीन है कि Rails.application.config.assets.paths बदल रहा है, वर्तमान अनुरोध के लिए, स्थायी रूप से, WHOLE एप्लिकेशन के लिए पथ जोड़ देगा। रेलवे एप्लिकेशंस में आपके द्वारा किए जा रहे कॉल में यह ठीक है। AS PREend_view_paths का विरोध करता है, जिसे केवल वर्तमान अनुरोध को प्रभावित करने के लिए प्रलेखित किया गया है। तो ओपी सवाल यह है कि अगर ऐसा कुछ है जो आप परिसंपत्ति_पैथ के लिए कर सकते हैं ... लेकिन Rails.application यह नहीं है। यह संभव है कि prepend_view_paths के लिए कोड को देखकर आपको यह पता चल सके कि इसे अपने आप में कैसे हैक करना है। – jrochkind

+0

हाँ। मुझे लगता है कि आप सही हैं। – pedz

1

मैं आपके प्रश्न पर टिप्पणीकर्ता से सहमत हूं कि "संपत्ति पाइपलाइन वास्तव में उत्पादन में प्रत्येक अनुरोध को आपकी संपत्तियों को संकलित करने के लिए नहीं है।" - वास्तव में जो आप पूछते हैं, वास्तव में करना संभव नहीं है।

तो आप जो कुछ भी वास्तव में पूरा करने की कोशिश कर रहे हैं उसे पूरा करने के विकल्प के बारे में, जो अलग-अलग सबडोमेन के लिए अलग-अलग संपत्ति समाधान है। अपने उप-डोमेन विशिष्ट संपत्तियों को अपने परिसंपत्ति फ़ोल्डरों की उप-निर्देशिकाओं में रखें।

अब, व्यू/हेल्पर्स में, जब आप एसेट_पैथ या किसी अन्य सहायक को कॉल करते हैं जो रिश्तेदार संपत्ति पथ लेते हैं, तो इसे "name_of_asset" के बजाय "# {subdomain}/name_of_asset" के लिए पूछें।

अब, संपत्ति कंपाइलर के तरीके के कारण, यह संभव यह उपनिर्देशिका विधि काम नहीं करेगी, आपको इसके बजाय वास्तविक फ़ाइल नाम की शुरुआत में सबडोमेन रखना पड़ सकता है। "# {उपडोमेन} _name_of_asset"। निश्चित नहीं।

और यह आपको अभी भी 'डिफ़ॉल्ट गिरावट' के माध्यम से नहीं देगा, जहां कुछ सबडोमेन में कुछ संपत्तियों में सबडोमेन-विशिष्ट संपत्ति नहीं होती है, वे डिफ़ॉल्ट रूप से 'गिरने' के लिए होती हैं। जो अच्छा होगा। यह भी संभव है कि ऐसा करने के लिए एक तरीका भी पता लगाया जा सके, सुनिश्चित नहीं है।

लेकिन किसी भी दर पर, अलग-अलग के लिए इस दृष्टिकोण के बाद तर्क/दृश्य में उपयोग करके डिस्प्ले-टाइम पर संपत्ति .... आपको अपने मूल सुझाए गए दृष्टिकोण से आगे ले जा रहा है, जो शायद ' टी संभव है।

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