2012-12-09 124 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