2011-09-15 17 views
21

मानक application.js से नियंत्रक विशिष्ट जावास्क्रिप्ट तर्क को रखने के लिए और केवल प्रासंगिक नियंत्रक द्वारा इसे शामिल करने के लिए, मैं इसे अपने स्वयं के .js फ़ाइल में डाल रहा हूं यह इस तरह की तरह लेआउट से नियंत्रक नाम के आधार पर:रेल-3.1 पूर्व-संकलन नियंत्रक विशिष्ट जेएस संपत्ति

<%= javascript_include_tag "application", params[:controller] %> 

कि बस ठीक काम करता है, लेकिन जब मैं उत्पादन करने के लिए एप्लिकेशन को तैनात (मैं Capistrano का उपयोग कर रहा है और एक पूर्व संकलित कार्य की स्थापना), संपत्ति पाइपलाइन नियंत्रक विशिष्ट जेएस फ़ाइलों में से किसी भी precompile नहीं है। मुझे लगता है कि ऐसा इसलिए है क्योंकि मेरी वास्तविक जावास्क्रिप्ट फ़ाइल को application.js में निर्देशों की आवश्यकता के संदर्भ में संदर्भित नहीं किया जाता है।

मैं अपने नियंत्रक विशिष्ट जेएस को application.js पर वापस ले जाकर, या स्पष्ट रूप से application.js से संदर्भित किए बिना इसका कैसे निपटूं?

क्या कोई अतिरिक्त सूची फ़ाइलों को पूर्व-संकलित करने के लिए संपत्ति पाइपलाइन को बताने का कोई तरीका है? मैं उत्पादन पर एक विशिष्ट फ़ाइल मैन्युअल रूप से कैसे संकलित कर सकता हूं?

अद्यतन

के रूप में यह turns out, आप अलग-अलग फ़ाइलों यहाँ config/environments/production.rb में निर्दिष्ट कर सकते हैं:

config.assets.precompile += %w(achievements.js) 

... या मैं बस आगे चला गया और चंचलता से हर JavaScript फ़ाइल के लिए यह कहा:

config.assets.precompile += %w(*.js) 
+2

यह वास्तव में स्वचालित होना चाहिए! –

+3

यह ध्यान देने योग्य है कि precomile सूची में scss/कॉफी फ़ाइलों को जोड़ना काम नहीं करेगा! (और कोई त्रुटि फेंक दो, या तो!)। आपको केवल .js/css एक्सटेंशन के साथ नाम देना होगा। –

उत्तर

4

यह वही है जो मैं करता हूं:

,210

निर्देशिका संरचना:

app/assets/javascripts/sessions/multiple.js 
app/assets/application-sessions.js 

आवेदन-sessions.js बस है:

*= require_self 
*= require_tree ./sessions 
फिर अपने ध्यान में रखते हुए

, मेरे application_controller में

<% if @current_controller == 'whatever' %> 
    <%= javascript_include_tag "application-sessions" %> 
<% else %> 
    …. 
<% end %> 

FYI करें, @current_controller = controller_name करना .rb विधियों, जिसे पहले_फिल्टर के साथ बुलाया जाता है।

+0

यह एक समाधान की तरह दिखता है हालांकि मेरे अपडेट में समाप्त होने से थोड़ा अधिक जटिल है। मुझे उम्मीद है कि मेरे समाधान के लिए कोई अनपेक्षित दुष्प्रभाव नहीं हैं। –

+0

मुझे लगता है कि आपका रास्ता ठीक है। जो मैंने सूचीबद्ध किया है वह आपको केवल जेएस फाइलों को शामिल करने की अनुमति देगा जो आप चाहते हैं कि आपके कोड के "क्षेत्र" के आधार पर। इस तरह, आप जो आवश्यक है उससे अधिक लोड नहीं कर रहे हैं। – jschorr

5

मुझे लगता है कि आप और james_schorr वास्तव में एक ही चीज़ के बारे में बात नहीं कर रहे हैं। आपको config.jets के अलावा config.assets.precompile में अन्य फ़ाइलों को जोड़ने की आवश्यकता है। अगर मैं गलत नहीं हूं, तो उसका उत्तर उस निर्देशिका संरचना के बारे में अधिक था जिसे आप अपनाना चाहिए/अपनाना चाहिए।

अगर मैं नियंत्रक विशिष्ट करना चाहते थे, मैं करना होगा:

/assets 
    /javascripts 
     /users 
      login.js 
      profile.js 
     /blogs 
     /posts 
     users.js 
     blogs.js 
     posts.js 

और उदाहरण के लिए, users.js होगा:

*= require_tree ./users 

इस तरह, आप संगठित रह सकते हैं (के लिए बहुत कुछ है जेएस फाइल प्रति नियंत्रक), लेकिन प्रोड में, वे सभी एक फ़ाइल में शामिल किया जाएगा।

फिर भी है कि जरूरत है अपने config में:

config.assets.precompile += %w(*.js) 
0

मैं एक ही मुद्दा यहाँ हो रहा है, यह मेरे लिए एक सिरदर्द है।

* .js सहित थोड़ा अधिक है, मैं नहीं चाहता कि प्रत्येक फाइल अलग फाइलों में संकलित हो, उनमें से कुछ को एक साथ विलय करने का अनुमान है।

मेरा विचार है, नियंत्रक विशिष्ट फ़ाइलों को "नियंत्रक" जैसे उप निर्देशिका में संग्रहीत करें, और फिर केवल प्रीकंपाइल के लिए नियंत्रक/*। जेएस या सीएसएस फ़ाइलें शामिल करें।

सुनिश्चित नहीं है कि यह काम करता है या नहीं, मैं इसे आज़माउंगा, वैसे भी, यह एक उपयोगी संकेत हो सकता है।

7

आप js precompile चाहते हैं | सीएसएस केवल संपत्ति/javascripts और संपत्ति/स्टाइलशीट निर्देशिका की जड़ में पाया (और नहीं उनके पेड़ पदानुक्रम), आप पर्यावरण फाइलों में इस डाल सकते हैं:

Dir.chdir "#{Rails.root}/app/assets/javascripts" 
    a = Dir.glob("*.{js,coffee,erb}") 
    Dir.chdir "#{Rails.root}/app/assets/stylesheets" 
    b = Dir.glob("*.{css,erb}") 
    config.assets.precompile += a.concat(b) 
    Dir.chdir Rails.root 
संबंधित मुद्दे