在Rails中嵌套布局

时间:2012-12-09 00:36:46

标签: ruby-on-rails

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

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

4 个答案:

答案 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 %>
        &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>