2013-05-05 5 views
5

सबसे पहले, मैं रेल के लिए नौसिखिया हूँ। मैं रेल वेबसाइट पर काम कर रहा हूं। इसमें तीन नियंत्रक हैं application_controller, static_pages_controllers और users_controller। उनके पास ऐप/एसेट्स/स्टाइलशीट्स/(application.css और users.css.scss) static_pages_controllers को छोड़कर और संबंधित लेआउट या सामान्य तत्वों के लिए कस्टम.css.scss भी है, में उनके संबंधित सीएसएस (एसएसएस) फ़ाइलें हैं मैं के रूप में उल्लेख hereरेल में नियंत्रक विशिष्ट स्टाइलशीट 3: विरासत

मेरे सवालों का नियंत्रक विशिष्ट शैली के लिए इस्तेमाल किया कर रहे हैं:

1) custom.css में सीएसएस नियम उन मैं अलग नियंत्रक सीएसएस में स्पष्ट रूप से परिभाषित किया है को छोड़कर सभी नियंत्रकों दृश्यों पर लागू होता है?

2) यदि हाँ, तो मैं एक नियम के दोनों custom.css.scss और users.css.scss

custom.css.scss में परिभाषित किया है - शरीर {पृष्ठभूमि रंग: रंग 1;}

users.css.scss - शरीर {पृष्ठभूमि रंग: रंग 2;}

लेकिन अभी भी दोनों static_pages_controllers और users_controllers में देखा गया पृष्ठभूमि रंग 2 दिखा। मुझसे कहां गलती हो रही है? user_controller में केवल दृश्यों को रंग 2 और static_pages_controller को रंग 1 दिखाना चाहिए।

+0

पृष्ठ (कार्रवाई?) इसका विशिष्ट संस्करण: http://stackoverflow.com/questions/15708794/page-specific-css-with-rails-app, जिसे तब http://stackoverflow.com/questions/6167805/ के डुप्लिकेट के रूप में चिह्नित किया गया था उपयोग-रेल-3-1-कहां-करते-आप-डाल-अपना-पृष्ठ-विशिष्ट-जावास्क्रिप्ट-कोड (सही IMHO)। –

+0

संबंधित: http://stackoverflow.com/questions/15708794/page-specific-css-with-rails-app –

उत्तर

37

Rails guide on how to use the asset pipeline यहां पूरी सच्चाई को बिल्कुल नहीं बताता है। इसे कहते हैं:

आप, अपने संबंधित संपत्ति फाइलों के अंदर एक नियंत्रक के लिए किसी भी जावास्क्रिप्ट या सीएसएस अद्वितीय रखना चाहिए के रूप में इन फ़ाइलों को तो बस इस तरह के <% = javascript_include_tag पैरामीटर के रूप में लाइनों के साथ इन नियंत्रकों के लिए लोड किया जा सकता [: नियंत्रक] %> या <% = stylesheet_link_tag पैराम्स [: नियंत्रक]%>।

अब, आप सकता है के रूप में वे सुझाव देते हैं करते हैं और प्रत्येक नियंत्रक के लिए विशिष्ट शैली लोड है, लेकिन के रूप में वे बॉक्स से बाहर का सुझाव यह काम नहीं करता। आपको कुछ चीजों का उल्लेख करने की उपेक्षा करना चाहिए।

  1. आप फ़ोल्डर में हर दूसरे परिसंपत्ति लोड होगा application.css, जो जगह में छोड़ दिया से //= require_tree . निर्देश दूर करने के लिए की जरूरत है,। इसका अर्थ यह है कि प्रत्येक पृष्ठ उपयोगकर्ता.css लोड करेगा, और यदि आपने नियंत्रक-विशिष्ट स्टाइलशीट लाइन को उनके उदाहरण में जोड़ा है, तो यह नियंत्रक स्टाइलशीट को दो बार लोड करेगा।

  2. आपको व्यक्तिगत फ़ाइलों को प्रीकंपाइल करने के लिए रेल को बताना होगा। डिफ़ॉल्ट रूप से, सभी * .css फ़ाइलों के अलावा application.css को प्रीकंपलर द्वारा अनदेखा किया जाता है।

    # in environments/production.rb 
    # either render all individual css files: 
    config.assets.precompile << "*.css" 
    # or include them individually 
    config.assets.precompile += %w(users.css static_pages.css) 
    
  3. अंत में, के रूप में रेल गाइड द्वारा निर्देश दिए, तो आप अपने स्टाइलशीट की तरह कुछ देखने के लिए भी शामिल है को बदलने की जरूरत होगी:: इसे ठीक करने के आप अपने config संपादित इस तरह कुछ करने के लिए क्या करना होगा

    <%# this would now only load application.css, not the whole tree %> 
    <%= stylesheet_link_tag :application, :media => "all" %> 
    
    <%# and this would load the controller specific file %> 
    <%= stylesheet_link_tag params[:controller] %> 
    

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

इसके अलावा, यदि आप अपने नियंत्रक विशिष्ट स्टाइलशीट में केवल ओवरराइड नियम जोड़ना चाहते हैं, तो आप गेट के बाहर शैलियों का लोड-ऑर्डर-विशिष्ट टेंगल बना रहे हैं। यह ... शायद अच्छा नहीं है।

// in application.css (or some other commonly loaded file) 
background-color: $color1; 

// in users.css.scss 
body.controller-users { 
    background-color: $color2; 
} 

// and so on... 
फिर अपने लेआउट में

, जैसे शरीर वर्ग के लिए नियंत्रक नाम जोड़ने,:

<body class="controller-<%= params[:controller] %>"> 

एक बेहतर दृष्टिकोण शैलियों, कुछ इस तरह नियंत्रक शीट में नाम स्थान के लिए हो सकता है

इस तरह, आपकी शैलियों को नामस्थान द्वारा हल किया जाता है, न केवल ऑर्डर लोड करें। इसके अलावा आप इस समाधान के साथ आगे बढ़ सकते हैं और यदि आप चाहें तो अलग नियंत्रक-विशिष्ट स्टाइलशीट लोड कर सकते हैं, या आप इसके बारे में भूल सकते हैं और बस सबकुछ application.css में संकलित करने दें क्योंकि यह डिफ़ॉल्ट रूप से होगा। सभी शैलियों को प्रत्येक पृष्ठ के लिए लोड किया जाएगा, लेकिन केवल नियंत्रक-विशिष्ट शैलियों को लागू किया जाएगा।

+1

यह एक * महान * उत्तर है, और भी अधिक क्योंकि यह एक अच्छा अभ्यास लेता है, आमतौर पर इस समुदाय में साझा किया जाता है , यह इसके डाउनसाइड्स दिखाता है और यह एक बेहतर विकल्प का प्रस्ताव करता है। बहुत धन्यवाद!! – PEF

0

रेल 4.x में

आप config में इन पंक्तियों जोड़ने के लिए/environment.rb

config.assets.precompile < < "* .css"

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