带Rails的动态菜单(在一个视图中引用两个控制器的输出)

时间:2011-11-17 13:06:06

标签: ruby-on-rails ruby menu controllers

我一直试图找到一种方法来显示应用程序从数据库生成的侧边菜单。由于菜单需要是用户可编辑的,我认为最好的做法是将其创建为脚手架,只需添加一个“显示菜单”动作即可以树状方式呈现菜单,而剩下的脚手架将允许管理员用户修改菜单项。

现在,我遇到了一个小问题 - 我无法找到一种方法来“调用”来自application.html.erb的show菜单操作(我将其用作所有操作和控制器的包装器) 。它有一个主'body',它有一个'yield'行,显然会让任何一个控制器被引用来渲染它的输出。在此之前,我希望在该HTML的不同部分显示动态菜单。

这可能吗,怎么会这样做呢?

因为无论显示哪个特定的动作(视图),都应该看到相同的菜单,我想避免在我的应用程序的每个控制器的每个视图中放置相同的“菜单渲染”逻辑。

1 个答案:

答案 0 :(得分:6)

从你的术语来看,我并不完全确定这是你所需要的,但现在就是这样。如果您想为不同类型的信息保留布局的不同部分,您可以这样做

<!-- In application.html.erb -->
<%= yield :menu %>
<!-- Main content goes here -->
<%= yield %>

然后,在要渲染的视图中,如果要显示菜单,可以执行以下操作。

<%= content_for :menu do %>
   <!-- Show menu -->
<% end %>

通过这种方式,您可以在视图中显示一个菜单,您希望在其中显示菜单,而不是在其他菜单中显示菜单。

--- --- UPDATE 对于带有从db检索的菜单选项的动态菜单,请执行此操作

在ApplicationController中添加before_filter

before_filter :fetch_menu


def fetch_menu
    @menu = #db query goes here
end

在application.html.erb

<div id="menu">
   <%@menu.each do |menu|%>
      <!-- Do something with menu -->
   <% end %>
</div>