在Rails中嵌套布局

是否可以在Rails 3.2中嵌套布局? 我想创建application.html.erb使用的通用布局,并允许应用程序中的几个视图使用它。 我找到了嵌套布局rubygem,但它在四年内没有更新。 如果我可以在application.html.erb文件中执行以下操作,那将是非常棒的:

 

我在这篇博文中找到了一个简单的解决方案。

在我的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' %> 

我尝试了其中的一些,但没有一个在Rails 4中对我有效。但是从nested_layouts gem中获得一些灵感,我想出了以下简单的修复:

 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模板修改为类似于:

   
<%= content_for?(:content) ? yield(:content) : yield %>

现在我可以声明一个这样的嵌套布局:

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

希望这可以帮助!

您可以使用官方Rails指南中描述的content_for方法。

AFAIK您的应用程序布局将包围您应用中的所有内容。 所以,只需将这些局部内容构建到您在各个视图级别上的关系中。

我有一个人物对象,模型的其他部分包含在他们的部分渲染中,如下所示。 它并不漂亮,但它有望与你想要完成的事情保持一致。

 
Registrant Information
Personal Information

<%= f.label "First Name" %> <%= f.text_field :firstname %>    <%= f.label "Last Name" %> <%= f.text_field :lastname %>    <%= f.label "Middle Init" %> <%= f.text_field :middleinit, :size=>2 %>    <%= f.label "Nickname" %> <%= f.text_field :nickname %>

<%= f.label :birthdate %> <%= f.date_select :birthdate, :start_year=>1935%>    <%= f.label :gender %> <%= f.select :gender, ['Male','Female'] %>

<%= f.label "T-Shirt Size" %>
<%= f.select :shirtsize, ['YS','YM','YL','S','M','L','XL','XXL'] %>


Address Information <%= f.fields_for :addresses do |builder| %> <%= render "address_fields", f: builder %> <% end %>
Email <%= f.fields_for :emails do |builder| %> <%= render "email_fields", f: builder %> <% end %> <%= link_to_add_fields "Add Email", f, :emails %>