首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >需要建议:子菜单的Rails视图结构?

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

Stack Overflow用户
提问于 2008-09-24 09:40:40
回答 2查看 2.3K关注 0票数 4

假设您的应用程序中有两个RESTful控制器(UsersController、OffersController)和一个PagesController (用于索引、关于等静态内容)。

您已经定义了以下路由:

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可见。所有其他的子菜单都可以完全跳过(根本不需要渲染)。

以管理菜单为例:该菜单应该对应用程序中除offers_path之外的所有RESTful路径都处于活动状态。激活表示该子菜单可见。

要做到这一点,我能想到的唯一解决方案是构建许多复杂的if条件,这很糟糕(编写和维护起来非常复杂)。我在寻找一个优雅的解决方案?

我希望有人能理解我的问题--如果有什么不清楚的地方,请评论我的问题,我会更详细地解释它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-09-24 14:47:05

您可以使用的一件事是you和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' %>

省去了你大量的打字工作。:)我发现这是一种很好的、干净的处理方式。

票数 6
EN

Stack Overflow用户

发布于 2008-09-24 12:30:12

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

所以,你的助手应该看起来像这样(请原谅ruby/rails伪代码,我已经有一两个月没接触过它了):

def render_admin_menu()
  if !current_path.contains('offer')
    render :partial => 'shared/admin_menu'
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/126238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档