Нужен совет: Структура представлений Rails для подменю? - PullRequest
4 голосов
/ 24 сентября 2008

Представьте себе, что в вашем приложении есть два контроллера 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 был виден в любое время. Все остальные подменю могут быть полностью пропущены (вообще не нужны).

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

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

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

Ответы [ 2 ]

6 голосов
/ 24 сентября 2008

Одна вещь, с которой вы можете поиграть, - yield и 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 голос
/ 24 сентября 2008

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

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

def render_admin_menu()
  if !current_path.contains('offer')
    render :partial => 'shared/admin_menu'
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...