2008-09-24 70 views
4

想象一下,在您的应用程序中有两个RESTful控制器(UsersController,OffersController)和一个PagesController(用于静态内容,如索引,about等等)。需要建议:子菜单的Rails视图结构?

您有以下途径定义:

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路径有效。活动意味着子菜单可见。

我能想到的唯一解决方案就是在条件和情况很糟糕的情况下构建复杂的系统(编写和维护起来非常复杂)。我正在寻找一个优雅的解决方案?

我希望有人能够理解我的问题 - 如果有什么不清楚的地方,只要评论一下这个问题,我会更详细地解释它。

回答

6

有一两件事你可以用玩的是产量和content_for ,与几个部分菜单一起使用。例如,你可以把菜单的各个部分的部分,然后修改您的布局是这样的:

<%= yield(:menu) %> 

然后你就可以指定你的意见content_for,把你想要的任何谐音进入菜单。如果没有指定,它将不会被渲染。

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

如果你使用了很多在大多数页面相同的菜单,在布局指定默认的,如果没有屈服(:菜单)中找到。

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

为您节省了很多打字。 :)我发现这是一个很好的处理事物的干净方式。

1

通常,我会抽象出菜单功能,以便我有用于呈现管理菜单的辅助方法。这样,就可以在帮助程序中尽可能多地添加逻辑,而不会让视图逻辑混乱。

所以,你的助手会是什么样子(原谅的Ruby/Rails伪代码,它已经有两个月,因为我摸了一下):

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

感谢您的想法。但是,将问题转移给帮手并不是真正的解决方案。另一方面,这确实是一个增强,我不希望在任何时候很快找到一个优雅的解决方案。也许别人有更好的把戏...... – 2008-09-24 12:43:37