2008-09-24 2 views
4

Представьте, что у вас есть два контроллера RESTful (UsersController, OffersController) и PagesController (используется для статического контента, такого как индекс, около и т. Д.) В вашем приложении.Нужна помощь: Структура представлений 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 быть видимыми в любое время , Все остальные подменю могут быть полностью пропущены (вообще не нужно отображать).

Возьмите меню администратора, например: Это меню должно быть активным для всех путей RESTful в приложении, за исключением offers_path. Активный означает, что подменю видно.

Единственное решение, которое я могу придумать для достижения этого, - это построить много сложнее, если условия и что отстой (очень сложно писать и поддерживать). Я ищу элегантное решение?

Я надеюсь, что кто-то поймет мой вопрос - если есть что-то непонятное, просто прокомментируйте вопрос, и я расскажу подробнее.

ответ

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

Как правило, я бы выделил функциональность меню, чтобы у меня был вспомогательный метод для отображения меню администратора. Таким образом, вы можете бросить столько логики в помощнике, сколько хотите, не загромождая свою логику взглядов.

Итак, ваш помощник будет выглядеть (простите рубин/рельсы псевдо-код, это был месяц или два, так как я коснулся его):

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

Спасибо за ваши мысли. Однако перемещение проблемы в помощник не является реальным решением. С другой стороны, это действительно усовершенствование, и я не ожидал найти изящное решение в ближайшее время. Может быть, у кого-то есть лучший трюк ... – 2008-09-24 12:43:37

Смежные вопросы