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

想象一下,在您的应用程序中有两个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 

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

   Demo Application   

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

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

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

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

你可以玩的一件事是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' %> 

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

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

所以,你的助手看起来像(原谅ruby / rails伪代码,自我触摸它以来已经过了一两个月):

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