2008-09-24 69 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