2011-05-08 11 views
12

शायद इसके लिए एक तकनीकी/कार्यान्वयन कारण है, लेकिन ऐसा लगता है कि "लेआउट" दृश्य परत के स्पष्ट रूप से स्पष्ट रूप से हिस्सा है, फिर भी रेल केवल नियंत्रक स्तर पर लेआउट निर्दिष्ट करने की अनुमति देता है।रेल दृश्य दृश्य की बजाय लेआउट चयन को नियंत्रक चिंता क्यों करते हैं? क्या मैं एक दृश्य से लेआउट चुन सकता हूं?

मेरे नियंत्रक को लेआउट के बारे में परवाह नहीं करना चाहिए ... टेम्पलेट्स चाहिए। क्या .erb फ़ाइल के भीतर से कौन से लेआउट का उपयोग करना है यह निर्दिष्ट करने का कोई तरीका है?

कुछ की तरह:

<%= with_layout :news_feed do %> 

    <p> 
    My markup in here. 
    </p> 

<% end %> 

या किसी अन्य कार्यान्वयन आप सोच सकते हैं ... लेकिन प्रलेखन केवल नियंत्रक के नजरिए से लेआउट का उल्लेख करने लगता है।

शायद with_layout सहायक को लागू करना बहुत कठिन नहीं होगा।

संपादित करें | मैंने पाया कि मैं वास्तव में क्या देख रहा था:

<% render :layout => "some_layout" do %> 
    <p> 
    My markup here 
    </p> 
<% end %> 

अब आप अपने ActionController है प्रदान की:

class ApplicationController < ActionController::Base 
    layout nil 

फिर प्रत्येक टेम्पलेट अपने स्वयं के लेआउट का चयन कर सकते हैं, इस दृष्टिकोण का उपयोग कर।

यदि आप एप/लेआउट में लेआउट डालते हैं, तो नियंत्रक से मेल खाने वाले नाम के साथ, उस लेआउट का उपयोग किया जाएगा, इसलिए आपको सख्ती से यह निर्दिष्ट नहीं करना चाहिए कि वे सभी समान हैं या नहीं।

लेआउट प्रतिपादन के बारे में है: किसी भी तरह से, दोस्त कैसे अब अपने टेम्पलेट लिखते हैं उस पर पूरा नियंत्रण है, न कि दोस्त है जो नियंत्रक :)

उत्तर

3

मैंने कुछ शोध किया और मुझे जो भी आप ढूंढ रहे हैं उसके समान कोई समाधान नहीं मिला।

मुझे लगता है कि इस तथ्य के साथ ऐसा करना पड़ सकता है कि डिफ़ॉल्ट के अलावा एक लेआउट निर्दिष्ट करना your_controllers_name.html.erb को app/views/layouts के तहत फ़ाइल नाम देकर किया जा सकता है। यह आपके नियंत्रक से किसी भी तर्क को हटा सकता है यदि एक ही लेआउट हमेशा एक विशिष्ट नियंत्रक के लिए उपयोग किया जाता है। शायद यही वह है जिसे आप ढूंढ रहे हैं? यदि आपके पास लेआउट के लिए मिलान करने वाला नियंत्रक नाम नहीं है, तो डिफ़ॉल्ट application.html.erb का उपयोग किया जाएगा।

यदि आपको सशर्त रूप से एक अलग लेआउट प्रस्तुत करने की आवश्यकता है, तो उस निर्णय को आपके नियंत्रक में करने की आवश्यकता है। अन्यथा आप निर्णय लेने के तर्क को अपने विचार में दबाएंगे। आपके विचार को यह निर्णय लेने की ज़रूरत नहीं है कि उसे किस लेआउट की आवश्यकता है क्योंकि नियंत्रक निर्णय लेने और किसी भी आवश्यक डेटा को स्थापित करने के लिए आवश्यक है।

+0

धन्यवाद, हाँ, मुझे यह दस्तावेज़ों से मिला है, लेकिन यह वास्तव में थोड़े अजीब लगता है। हमारी टीम डिजाइनरों और डेवलपर्स में काफी स्पष्ट रूप से विभाजित है, और डिजाइनरों को कभी भी हमारे नियंत्रकों को छूना नहीं चाहिए। शायद हम सामने वाले लोगों द्वारा शामिल शीर्ष और निचले हिस्सों के लिए एक खाली लेआउट का उपयोग करने के लिए वापस आ जाएंगे। या शायद मैं ऐसे समाधान की जांच करूंगा जो 'with_layout' ब्लॉक को अनुमति दे। हमारे पास चार या पांच "मानक" लेआउट हैं, और वे किसी भी विशिष्ट नियंत्रकों से जरूरी नहीं हैं ... यह केवल पृष्ठ सामग्री पर निर्भर करता है। – d11wtq

+1

'<% रेंडर: लेआउट =>" some_layout "%%> .... <% end %>;) – d11wtq

+0

@ d11wtq - मुझे लगता है कि आप कहां से आ रहे हैं, हालांकि आपके डिजाइनरों को अभी भी नियंत्रक कोड को स्पर्श करने की आवश्यकता नहीं होगी? वे केवल लेआउट निर्देशिका में लेआउट बना सकते हैं और फिर डेवलपर्स यदि आवश्यक हो तो कोई सशर्त कोड जोड़ देंगे। आम तौर पर आप शायद 95% समय के लिए कंट्रोलर नामकरण सम्मेलन योजना से दूर हो सकते हैं। – McStretch

1

कुछ बयानों लिख रही है।
लेआउट केवल एक बार कहा जा सकता है।
विचार - प्रतिपादन के शीर्ष (अंतिम) स्तर हैं।
नियंत्रक - एक प्रथम स्तर की प्रतिपादन परत है।

तो मैं कह सकता हूं कि केवल वह स्थान जहां हम लेआउट सेट कर सकते हैं - एक नियंत्रक है। अगर हम विचारों से लेआउट सेट कर सकते हैं, तो हमें नेस्टेड लेआउटिंग में समस्याएं मिलेंगी, क्योंकि प्रत्येक दृश्य (आंशिक भी) अपने स्वयं के लेआउट को कॉल करेगा।

यह आसान और स्पष्ट है कि नियंत्रक लेआउट सेट करता है। और अगर हम अपने बच्चों से पैरेंट लेवल व्यू सेट कर रहे हैं तो यह अस्पष्ट और गन्दा है।

आप किस बारे में बात कर रहे हैं - उपज (content_for) और आंशिक (render :partial) है। यह बहुत अच्छा उपकरण है और वे सही काम करते हैं।

+1

वैसे मुझे असहमत होना होगा कि यह एक नियंत्रक चिंता है। यह सबसे आसान समाधान हो सकता है, लेकिन लेआउट मूल रूप से टेम्पलेट का हिस्सा है; इसमें नियंत्रक के साथ कुछ लेना देना नहीं है। मुझे पता है कि जिस स्थान पर हम इसे सेट करते हैं वह नियंत्रक में है ... लेकिन यह एक रेल चीज है, एमवीसी चीज नहीं। – d11wtq

+0

इसके अलावा, नेस्टेड लेआउट के संबंध में, सामग्री के आस-पास ड्राइंग बक्से जैसी चीज़ों के लिए सब-लेआउट होना संभव होगा ... यह मूल रूप से केवल यह कह रहा है: "मैं कुछ सामग्री उत्पन्न करने वाला हूं, और मुझे यह चाहिए उस सामग्री को प्रस्तुत करने के लिए फ़ाइल "। चाहे उस फ़ाइल में टैग हैं और अन्य शीर्ष-स्तरीय सामान न तो यहां हैं और न ही वहां हैं;) – d11wtq

+1

@ d11wtq, 'सामग्री के आस-पास ड्राइंग बक्से जैसी चीजों के लिए', जो कि आंशिक है। आपको सब कुछ ठीक नहीं है। लेआउट - बिना किसी sublayouts के एक एकल फ़ाइल है। Sublayouts __partials__ हैं। नियंत्रक चिंता प्रतिपादन के लिए प्रारंभ बिंदु के रूप में एक लेआउट चुनना है। असल में नियंत्रक क्या करता है - __is rendering__। तो यह लेआउट चुनने के लिए नियंत्रक काम है। – fl00r

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