2011-09-06 9 views
9

मैं एक विषमता में आया हूं कि मैं रेल 3 के संबंध में काफी व्याख्या नहीं कर सकता और लेआउट (नियंत्रक से) के साथ आंशिक प्रतिपादन नहीं कर सकता। मुझे उम्मीद है कि कोई क्या हो रहा है में थोड़ा अंतर्दृष्टि प्रदान कर सकता है।रेल 3 बनाम 2.3.5 के साथ विषमताएं प्रस्तुत करें: आंशिक और: लेआउट

सबसे पहले, हम इस नियंत्रक को "विरासत" नियंत्रक कहते हैं। यह काफी समय से आसपास रहा है और बहुत सी चीजें गलत कर रही है, लेकिन मैं इस बिंदु पर इसे फिर से समझने की कोशिश नहीं कर रहा हूं इसलिए मैं जो कुछ भी करता हूं उसके साथ काम करने के तरीकों को ढूंढने की कोशिश कर रहा हूं।

new कार्रवाई कुछ इस तरह (BarsController में)

def new 
    if something 
    render :partial => "foo", :layout => "bars" 
    elsif something_else 
    render :partial => "foo2", :layout => "bars" 
    elsif something_else_else 
    render :partial => "foo3", :layout => "bars" 
    else 
    render :partial => "foo4", :layout => "bars" 
end 

अब, रेल 2.3.5 में है, यह ठीक काम किया। यह उचित लेआउट के अंदर उचित आंशिक प्रस्तुत करेगा - मुझे एहसास है कि लेआउट विकल्प अनावश्यक है क्योंकि यह बिना किसी लेआउट लेआउट के लिए डिफ़ॉल्ट होगा। जब हम 3.0.x रेल करने के लिए उन्नत, हम इस प्रकार की त्रुटियों हो रही शुरू कर दिया:

Missing partial layouts/bars with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html] 

जाहिर layouts/bars.html.erb फ़ाइल है और हमेशा किया गया है, तो मैं यह समझ नहीं सकता है। मैं :layout => false के साथ प्रस्तुत करने में सक्षम था, लेकिन यह निश्चित रूप से काम नहीं करेगा। आखिरकार मैं पता लगा कि अगर मैं निम्न में से कोई एक कार्य करें, यह काम करता है:

1) bars.html.erb के बजाय _bars.html.erb करने के लिए अपने लेआउट का नाम बदलें और:

render :partial => 'foo2', :layout => 'bars'

2) bars.html.erb के रूप में मेरे लेआउट रखें (क्या मैं चाहता हूँ) और:

render '_foo2' # :partial option is redundant here anyway


ऐसा लगता है कि स्ट्रिंग के बजाय आंशिक विकल्प का उपयोग करके पहले पैरामीटर के रूप में _name.html.erb दोनों partial और layout पर रेलवे लागू करने का कारण बन रहा है। अगर मैं अंडरस्कोर को अपने आप में डालता हूं, तो यह उस व्यवहार के लिए वापस आ जाता है जिसकी मुझे उम्मीद है कि लेआउट के नाम के नीचे _ प्रीपेड नहीं करना है।

क्या कोई जानता है कि ऐसा क्यों है?


संपादित ठीक है, यकीन नहीं है कि कैसे मैं इस याद किया ... लेकिन यहाँ इस का उल्लेख कर रही डॉक्स में कुछ। ऐसा लगता है कि यह 2.3.8 के आसपास रहा है, शायद यह 2.3.5 में अलग किया गया था (हम क्या चल रहे थे)?

3.4.3 आंशिक लेआउट

एक आंशिक अपनी ही लेआउट फ़ाइल का उपयोग कर सकते हैं, बस के रूप में एक दृश्य के एक लेआउट का उपयोग कर सकते हैं।

<% = प्रस्तुत करना "link_area",: लेआउट => "graybar"%> यह एक आंशिक नामित _link_area.html.erb के लिए देखने के लिए और का उपयोग कर इसे प्रस्तुत करना होगा उदाहरण के लिए, अगर आप इस तरह एक आंशिक कॉल कर सकते हैं लेआउट _graybar.html.erb।ध्यान दें कि आंशिक के लिए लेआउट एक ही नियमित आंशिक के रूप में अग्रणी-अंडरस्कोर नामकरण का पालन करते हैं, और उसी आंशिक भाग में रखे गए हैं जो वे संबंधित हैं (मास्टर लेआउट फ़ोल्डर में नहीं)।


+0

यदि आप आंशिक रूप से पैरामीटर पास करते हैं, तो ऑब्जेक्ट या स्थानीय लोगों के लिए टेम्पलेट्स के साथ काम नहीं करते हैं, तो इसके लिए अधिक कोड मोड की आवश्यकता होगी। काश वे व्यवहार को नहीं बदला था ... – farhadf

उत्तर

15

यहाँ प्रश्न के आधार पर करने के लिए अपने खुद के जवाब क्या मैं ऊपर संपादित किया है:

रेल 2.3.8 के बाद से, यह के रूप में यद्यपि डिफ़ॉल्ट व्यवहार जब साथ render :partial => 'foo', :layout => 'bars' है एक आंशिक प्रतिपादन प्रकट होता "आंशिक लेआउट" फ़ाइल के साथ-साथ आंशिक दृश्य फ़ाइल की अपेक्षा करने के लिए।

render '_foo', :layout => 'bars'

: इस मामले में यह

app/views/_foo.html.erb रूप में अच्छी तरह app/views/layouts/_bars.html.erb

के रूप में रेल 2.3.5 से इस समस्या का सामना उन्नयन किसी के लिए उम्मीद करेंगे, यहाँ समाधान मैं प्रभाव कम से कम मात्रा है पाया है

यह समाधान यह नहीं मानता कि आप आंशिक प्रतिपादन कर रहे हैं और इसलिए आंशिक लेआउट की अपेक्षा नहीं करते हैं। दूसरा विकल्प

app/views/layouts/_bars.html.erb

करने के लिए अपने लेआउट नकल और

render :partial => 'foo', :layouts => 'bars'

उपयोग करने के लिए होगा, लेकिन है कि कोड के कुछ दोहराव का परिणाम है।

रेल 2.3.8+ डॉक्टर इस बारे में:

3.4.3 आंशिक लेआउट

एक आंशिक अपनी ही लेआउट फ़ाइल का उपयोग कर सकते हैं, बस के रूप में एक दृश्य के एक लेआउट का उपयोग कर सकते हैं।

<% = प्रस्तुत करना "link_area",: लेआउट => "graybar"%> यह एक आंशिक नामित _link_area.html.erb के लिए देखने के लिए और का उपयोग कर इसे प्रस्तुत करना होगा उदाहरण के लिए, अगर आप इस तरह एक आंशिक कॉल कर सकते हैं लेआउट _graybar.html.erb। ध्यान दें कि आंशिक के लिए लेआउट एक ही नियमित आंशिक के रूप में अग्रणी-अंडरस्कोर नामकरण का पालन करते हैं, और उसी आंशिक भाग में रखे गए हैं जो वे संबंधित हैं (मास्टर लेआउट फ़ोल्डर में नहीं)।

+0

बहुत उपयोगी, साझा करने के लिए धन्यवाद! – Rubytastic

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