是否可以在Rails 3.2中嵌套布局?我想创建application.html.erb使用的通用布局,并允许应用程序中的几个视图使用它。我找到了Nested Layouts红宝石宝石,但它在四年内没有更新。如果我可以在application.html.erb文件中执行以下操作,那将是非常棒的:
<% inside_layout 'html5_boilerplate' do %>
<div id="container">
<%= yield %>
</div>
<% end %>
答案 0 :(得分: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 :(得分: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 %>
希望这有帮助!
答案 2 :(得分:1)
您可以使用content_for
方法as described in the official Rails guide。
答案 3 :(得分:0)
AFAIK您的应用程序布局将包围您应用中的所有内容。所以,只需将这些部分内容构建到您在各个视图级别上的关系中。
我有一个person对象,它的部分渲染中包含模型的其他部分,如下所示。它并不漂亮,但希望它符合您想要完成的任务。
<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 %>
<%= 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 %>
</p>
<p class="field">
<%= f.label :birthdate %>
<%= f.date_select :birthdate, :start_year=>1935%>
<%= 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>