2013-06-21 35 views
4

我在寻找解决方案以部分产生多个yields部分在轨中有多个产量

在实际的例子,我有这样的看法结构:

基本application.erb(/views/layouts/application.erb):

<!DOCTYPE html> 
<head> 
    <title>Some title</title> 
</head> 
<body> 
<div class="page"> 
    <%= yield %> 
</div> 
</body> 
</html> 

有些偏干我的代码(/视图/共享/ content.erb):

<div class="content"> 
    <div class="sidebar"> 
     <%= yield :sidebar %> 
    </div> 
    <div class="main"> 
     <%= yield %> 
    </div> 
</div> 

和控制器视图(/views/home/index.erb):

<%= render :partial => 'layouts/header' %>  
<%= render :partial => 'shared/navigation' %> 

<% # It is close to what I want to do %> 
<%= render :layout => 'shared/content' do %> 
    <% content_for :sidebar do %> 
     <%# This is will go to application.erb, not in content.erb %> 
     <%= render :partial => 'shared/menu' %> 
    <% end %> 

    <%= yield %> 
<% end %> 

<%= render :partial => 'layouts/footer' %> 

所以这里的主要问题是有多个产量区和能力的模板块自定义HTML通过或使另一部分。

回答

2

在我的情况下,我找到了这样的解决方案。

在我的控制器的视图(/views/home/index.erb):

<% sidebar_content = render :partial => 'shared/slider' %> 
<%= render :layout => 'shared/content', :locals => {:sidebar => sidebar_content} do %> 
    <%= yield %> 
<% end %> 

局部具有多个区域(/views/shared/content.erb):

<div class="content"> 
    <div class="sidebar"> 
     <%= sidebar %> 
    </div> 
    <div class="main"> 
     <%= yield %> 
    </div> 
</div> 

这个解决方案看起来不漂亮,但它的工作原理。我希望能在不久的将来找到更好的东西。

+0

您是否已经找到了更好的解决方案? – Lichtamberg

+0

没有。我用模板改变了我的工作流程。我只使用partials,并试图避免passig另一个partial作为参数。特别是在上面提到的例子中,我将在里面创建一个'内容'部分'菜单'。 '/ shared/content/default.erb', '/ shared/content/with_menu.erb' –

+0

Hm ok .. thx!我也没有找到更好的解决方案.. – Lichtamberg

4

这个问题很旧,但是,当我在Google上搜索答案时,它仍然相关。

我已经想出了一个解决方案,虽然还不漂亮,但效果很好。这个想法使用Rails的capture方法,它需要一个块,并存储其内容到一个变量:

controller.html.erb

<%= render 'shared/partial', body: capture { %> 
    My body content 
<% }, footer: capture { %> 
    My footer content 
<% } %> 

共享/ _partial.html.erb

<div id="body"><%= body %></div> 
<div id="footer"><%= footer %></div> 

希望这可以帮助别人!