2012-12-09 171 views
4

是否可以在Rails 3.2中嵌套佈局?我想創建application.html.erb使用的通用佈局,並允許應用程序中的一些視圖使用它。我發現了Nested Layouts紅寶石,但它在四年內還沒有更新。這將是真棒,如果我能做到像下面這樣在我application.html.erb文件:在Rails中嵌套佈局

<% inside_layout 'html5_boilerplate' do %> 
    <div id="container"> 
    <%= yield %> 
    </div> 
<% end %> 

回答

10

我在this blog post找到了一個簡單的解決方案。

在我ApplicationHelper,我增加了以下內容:

def parent_layout(layout) 
    @view_flow.set(:layout, output_buffer) 
    self.output_buffer = render(:file => "layouts/#{layout}") 
end 

在application.html.erb,我說:

<% parent_layout 'html5_boilerplate' %> 
+1

對於任何遇到此問題的人,我現在都使用[Nestive](https://github.com/rwz/nestive),並且效果很好。 – LandonSchropp

1

可以使用content_for方法as described in the official Rails guide

+0

你可以使用它嵌套在佈局中的佈局嗎? – LandonSchropp

+0

是的,另請參閱http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for或http://railscasts.com/episodes/8-layouts-and-content-for – Lichtamberg

+0

我很抱歉,但我仍然沒有采用這種方法。我如何使用content_for在佈局中呈現佈局?你能提供一個代碼示例嗎? – LandonSchropp

0

AFAIK您的應用程序佈局將包圍應用程序中的所有內容。所以真的只是將這些部分建立到您在單個視圖級別上的關係中。

我有一個人物對象,它包含在其部分渲染中的模型的其他部分包含在下面的div中。這不是很好,但它希望符合你想要完成的任務。

<div id="div-1"> 
    <fieldset><legend><b>Registrant Information</b></legend> 
     <fieldset><legend><b>Personal Information</b></legend> 
      <p class="field"> 
      <%= f.label "First Name" %> 
      <%= f.text_field :firstname %> 
     &nbsp;&nbsp; 
      <%= f.label "Last Name" %> 
      <%= f.text_field :lastname %> 
     &nbsp;&nbsp; 
      <%= f.label "Middle Init" %> 
      <%= f.text_field :middleinit, :size=>2 %> 
     &nbsp;&nbsp; 
      <%= f.label "Nickname" %> 
      <%= f.text_field :nickname %> 
      </p> 
      <p class="field"> 
      <%= f.label :birthdate %> 
      <%= f.date_select :birthdate, :start_year=>1935%> 
     &nbsp;&nbsp; 
      <%= f.label :gender %> 
      <%= f.select :gender, ['Male','Female'] %> 
      </p> 
      <p class="field"> 
      <%= f.label "T-Shirt Size" %><br /> 
      <%= f.select :shirtsize, ['YS','YM','YL','S','M','L','XL','XXL'] %> 
      </p> 
     </fieldset><br/> 
     <fieldset><legend><b>Address Information</b></legend> 
      <%= f.fields_for :addresses do |builder| %> 
      <%= render "address_fields", f: builder %> 
      <% end %> 
     </fieldset> 
     <fieldset><legend><b>Email</b></legend> 
      <%= f.fields_for :emails do |builder| %> 
       <%= render "email_fields", f: builder %> 
      <% end %> 
      <%= link_to_add_fields "Add Email", f, :emails %> 
     </fieldset> 
    </fieldset>  
</div> 
+0

對於我的用例,我試圖創建兩個佈局,一個application.html.erb佈局,它包含我的應用程序的基本標記和一個HTML5 Boilerplate佈局。我在應用程序中有幾頁不會使用我的主應用程序佈局(例如我的着陸頁),我希望他們使用HTML5 Boilerplate佈局。這種方法的問題是我不想在我的視圖中渲染某些東西(這將是一個使用partials的更加合適的地方),我將在application.html.erb中渲染我的視圖,這將在html5_boilerplate .html.erb。 – LandonSchropp

4

我嘗試了一些這些,但沒有在爲我工作Rails 4.但從nested_layouts寶石的一點靈感,我想出了以下簡單的修復:

module ApplicationHelper 
    def inside_layout(layout, &block) 
    layout = "layouts/#{layout}" unless layout =~ %r[\Alayouts/] 
    content_for :content, capture(&block) 
    render template: layout 
    end 
end 

然後我修改我的layouts/application.html.erb模板與此類似:

<html> 
    <body> 
    <div id="content"> 
     <%= content_for?(:content) ? yield(:content) : yield %> 
    </div> 
    </body> 
</html> 

現在我可以聲明嵌套佈局是這樣的:

# app/views/layouts/blog.html.erb 
<%= inside_layout 'application' do %> 
    <div id="blog_container"> 
    <%= yield %> 
    </div> 
<% end %> 

希望這有助於!

+0

非常好。謝謝。 – Bijan