5

是否可以在 Rails 3.2 中嵌套布局?我想创建一个由 application.html.erb 使用的通用布局,并允许应用程序中的几个视图使用它。我找到了Nested Layouts ruby​​ gem,但它已经四年没有更新了。如果我可以在我的 application.html.erb 文件中执行以下操作,那就太棒了:

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

4 回答 4

11

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

在我的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' %>
于 2012-12-09T03:07:42.443 回答
5

我尝试了其中的一些,但在 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模板,使其类似于:

<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 %>

希望这可以帮助!

于 2013-05-04T16:33:45.263 回答
1

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

于 2012-12-09T00:45:13.370 回答
0

AFAIK 您的应用程序布局将围绕您的应用程序中的所有内容。所以真的只是将这些部分构建到您在个人视图级别上的关系中。

我有一个人对象,该对象的模型的其他部分包含在它们的部分渲染中,如下所示。它并不漂亮,但希望它符合您想要完成的目标。

<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>
于 2012-12-09T00:54:21.587 回答