2015-10-19 13 views
0

为了尽可能保持我的应用程序视图为DRY,我遇到了一些问题。我的appliation.html.erb合并了一个静态的侧边栏菜单。我的每个主控制器都包含一个辅助侧栏菜单(本质上是一个子菜单)。我可以将呈现菜单的代码从application.html.erb中提取出来,并将其放入每个视图中,并在那里更改次要边栏,但这在我的视图中会产生很多重复。侧栏的DRY视图

我看到这个SO post,看着this page,但我无法得到任何想法工作。我在想,我可以把这样的:

<% provide(:submenu, 'layouts/sidebars/sidebar_customers_contacts') %> 

在每个视图顶部,并使用从application.html.erb但当然做

<% content_for(:submenu) do %> 
    <%= render :partial => :submenu %> 
<% end %> 

渲染相关的部分那没用。

这是我目前application.html.erb:

<div class="side"> 
    <%= render 'layouts/sidebar' %> 
    <%= render 'layouts/sidebars/sidebar_dashboard' %><!-- this needs to load a sidebar based on the controller that calls it. Each view of the controller will get the same sidebar. --> 
    </div> 
    <div class="main-content"> 
    <%= yield %> 
    </div> 

我觉得我做这个难度比它确实是。有没有简单的方法来做到这一点?

回答

0

Rails提供了一个名为controller_name的帮助程序,您可以阅读更多关于here的帮助。

假设你遵守自己的命名约定,这应该按原样工作。如果您决定某些控制器没有得到一个工具,你可能需要一些条件语句扔...

application.html.erb

<div class="side"> 
    <%= render "layouts/sidebar" %> 
    <%= render "layouts/sidebars/#{ controller_name }" %> 
</div> 
<div class="main-content"> 
    <%= yield %> 
</div> 

编辑 对不起,我错了使用单引号而不是双引号。您不能在单引号内使用#{字符串插值}。 Source

+0

Thanks @Lenny Bose。这是完美的,如果我能得到它的工作。我尝试了controller_name,controller.controller_name,'@ controller.controller_name',并且我得到'部分名称(layouts/sidebars /#{controller_name})不是每个人的有效Ruby标识符。我的语法不正确?我正在使用答案中显示的语法,甚至是它的一些变体。任何想法我做错了什么? – mack

+0

错误点在正确的方向。 Rails没有将控制器名称插入其值,而只是使用变量名称。我上面的编辑应该工作。 –

+0

太棒了!这是关于我没有尝试过的唯一变体,当然它是唯一可行的变体。 : ) 感谢您的帮助。 – mack