需要建议:子菜单的Rails视图结构?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (10)

想象一下,在您的应用程序中有两个RESTful控制器(UsersController,OffersController)和一个PagesController(用于静态内容,如index,about等)。

您定义了以下路由:

map.with_options :controller => 'pages' do |pages|
  pages.root :action => 'index'     # static home page
  pages.about :action => 'about'    # static about page
  # maybe more static pages...
end
map.resources :users    # RESTful UsersController
map.resources :posts    # RESTful PostsController

您的应用程序布局如下所示:

<html>
  <head>
    <title>Demo Application</title>
  </head>
  <body>
    <ul id="menu">
       <li>
         <%= link_to 'Home', root_path %>
       </li>
       <li>
         <%= link_to 'Offers', offers_path %>
         <ul id="submenu>
           <li><%= link_to 'Search', 'path/to/search' %></li>
           <li>maybe more links...</li>
         </ul>
       </li>
       <li>
         <%= link_to 'About', about_path %>
       </li>
       <li>
         <%= link_to 'Admin', users_path %>
         <ul id="submenu">
           <li><%= link_to 'New User', new_user_path %></li>
           <li><%= link_to 'New Offer', new_offer_path %></li>
           <li>maybe more links</li>
         </ul>
       </li>
    </li>
    <%= yield %>
  </body>
</html>

布局的问题是我希望#submenu任何时候只能看到一个。可以完全跳过所有其他子菜单(根本不需要渲染)。

以Admin菜单为例:除了for之外,该菜单应对应用程序中的所有RESTful路径都是活动的offers_path。活动表示子菜单可见。

我能想到实现这一目标的唯一解决方案是,如果条件太糟糕(编写和维护起来非常复杂),那么构建很复杂。我在寻找一个优雅的解决方案?

我希望有人理解我的问题 - 如果有什么不清楚只是评论这个问题,我将更详细地解释它。

提问于
用户回答回答于

你只能操作yield和content_for,与菜单的一些部分一起使用。例如,您可以将菜单的每个部分放在一个部分,然后将您的布局修改为:

<%= yield(:menu) %>

然后,您可以在视图中指定content_for,并将您想要的任何部分放入菜单中。如果没有指定它将不会被渲染。

<% content_for(:menu) do %>
   <%= render :partial => 'layouts/menu' %>
   <%= render :partial => 'layouts/search_menu' %>
    etc...
 <% end %>

如果您在大多数页面中使用了大量相同的菜单,请在未找到yield(:menu)的情况下在布局中指定默认值。

<%= yield(:menu) || render :partial => 'layouts/menu_default' %>

为您节省大量的打字费用。:)我发现这是处理事情的一种很好的清洁方式。

用户回答回答于

通常,我会抽象出菜单功能,以便我有一个帮助方法来呈现Admin菜单。这样,就可以在帮助程序中抛出尽可能多的逻辑,而不会使视图逻辑蒙上阴影。

def render_admin_menu() if !current_path.contains('offer') render :partial => 'shared/admin_menu' end end

扫码关注云+社区

领取腾讯云代金券