2010-10-06 5 views
6

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

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

तो मैं अपने आवेदन लेआउट में कुछ इस तरह है:

<html> 
<body> 

<div id="content"> 

<%= yield %> 

</div> 

</body> 
</html> 

और मैं

<html> 
<body> 

<div id="content"> 

    <div id="sidebar"></div> 

    <%= yield %> 

</div> 

</body> 
</html> 

चाहते वहाँ कोड को कॉपी किए बिना यह पूरा करने के लिए एक रास्ता है?

उत्तर

3

अपने/खाता मार्ग खाता नियंत्रक के लिए बाध्य है, तो आप हमेशा की तरह इस

render :template => "/shared/sidebar" if controller.controller_name == "account" 

(मैं स्वीकार करने के लिए है कि यह आंख हालांकि खुशी नहीं देता है)

सशर्त भाग के साथ एक fullfeatured लेआउट हो सकता है
4

अक्सर आपके पास साइट के अन्य हिस्सों के लिए एक ही स्थिति होगी, इस मामले में यह नेस्टेड लेआउट का उपयोग करने के लिए समझ में आ सकता है।

http://guides.rubyonrails.org/v2.3.8/layouts_and_rendering.html#using-nested-layouts

+0

उसी दस्तावेज़ के बाद [बाद के संस्करण] (http://guides.rubyonrails.org/v4.0.12/layouts_and_rendering.html#using-nested-layouts) को देखना सुनिश्चित करें। रेल के नए संस्करणों में बदलाव हुए थे और लिंक किए गए उदाहरण अब काम नहीं कर सकते हैं। –

5

आप एक से अधिक एक लेआउट में एक yield हो सकता है, बस अतिरिक्त लोगों को एक नाम देना:

<html> 
<body> 
    <div id="content"> 
    <%= yield :sidebar %> 
    <%= yield %> 
    </div> 
</body> 
</html> 

आप content_for विधि

का उपयोग करके कि yield के लिए HTML जोड़ सकते हैं
<% content_for :sidebar do -%> 
    <div id="sidebar"></div> 
<% end -%> 

लेकिन आपको उस दृश्य को जोड़ना होगा जिसमें आप एक साइडबार चाहते हैं। इसके बजाय, views/layouts/application_with_sidebar.html.erb

<% content_for :sidebar do -%> 
    <div id="sidebar"></div> 
<% end -%> 

<%= render :file => 'layouts/application' %> 

Further reading

बनाते हैं तो आप कम से कम yield रों की संख्या रखना चाहते हैं, तो आप अपने लेआउट घोंसला बजाय कर सकते हैं।

विचारों/लेआउट/application.html.erb

<html> 
<body> 
    <div id="content"> 
    <%= yield(:with_sidebar) or yield %> 
    </div> 
</body> 
</html> 

विचारों/लेआउट/application_with_sidebar.html.erb

<% content_for :with_sidebar do -%> 
    <div id="sidebar"></div> 
<% end -%> 

<%= render :file => 'layouts/application' %> 

नियंत्रकों/accounts_controller.rb

class AccountsController < ApplicationController 
    layout 'application_with_sidebar' 
    ... 
end 
+0

फिर मैं मुख्य, वैश्विक लेआउट में चर फेंक रहा हूं जो साइट के सभी वर्गों पर लागू नहीं होता है।बस सही महसूस नहीं करता है। विचार के लिए धन्यवाद। –

+0

@Chad नेस्टेड लेआउट जैसे @mark सुझाए गए शायद सबसे अच्छे विकल्प हैं। यह सब इस बात पर निर्भर करता है कि आपको दिखाने के लिए इस मार्कअप की कितनी बार आवश्यकता है। –