2012-03-10 3 views
3

У меня есть простое меню, которое выглядит следующим образом:Лучший способ создать простое меню в приложении рельсы

<ul class="menu"> 
    <li class="active"><a href="<%= root_path %>">Home</a></li> 
    <li class=""><%= link_to 'Feeds' , feeds_path %></li> 
    <li class=""><%= link_to 'Accounts' , accounts_path %></li> 
</ul> 

класса «активный» это стиль, чтобы отметить мою текущую страницу.

У меня есть два вопроса:
1. Как мне сказать «приложение», на какой странице я веду, и попросить «изменить» класс на активный?
2. Есть ли лучший способ создать это меню (возможно, управляемый контроллером или db-таблицей)?

Я понимаю, что это вопрос новичков, но я подумывал об этом в течение нескольких дней, прочитал несколько руководств, но никто из них действительно не щелкнул.

Благодарим за помощь.

+0

возможной альтернативой является использование выхода, как house9 ответа http://stackoverflow.com/questions/8625829/design-pattern-for-side-bar-with-dynamic-content-in-rails/8626755# 8626755 – Hishalv

ответ

0

Я использую метод current_page?, чтобы установить активную ссылку. В качестве параметра он принимает путь. Я создаю хэш текстов ссылок и путей и перебираю его, печатая ссылки. Таким образом мне нужно только позвонить current_page? один раз.

Есть драгоценные камни, которые могут вам помочь. Посмотрите на эти: https://www.ruby-toolbox.com/categories/rails_menu_builders

0

Не идеальное решение, но вы можете сделать следующее.

создать 3 переменные:

@homeActive = "" 
@feedsActive = "" 
@accountsActive = "" 

В коде вы предусмотрели, установите класс каждой переменной, соответствующей имени.

<li [email protected]><a href="<%= root_path %>">Home</a></li> 

Теперь в контроллере под метод дома позволяет сказать, установить @homeActive = "active", а два других на «». Повторите это для других методов, и это должно сработать.

1

Я сделал это недавно в ApplicationHelper:

def nav_links 
    items = [home_link, about_me_link, contact_link] 
    content_tag :ul, :class => "nav" do 
     items.collect { |item| concat item} 
    end 
    end 

    def home_link 
    nav_item_active_if([email protected] || @article.type.nil?) do 
    link_to "Home", root_path 
    end 
    end 

    def about_me_link 
    nav_item_active_if(@article && @article.type == "About") do 
     link_to "About Me", article_path(About.first) 
    end 
    end 

    def contact_link 
    nav_item_active_if(@article && @article.type == "Contact") do 
     link_to "Contact", article_path(Contact.first) 
    end 
    end 

    def nav_item_active_if(condition, attributes = {}, &block) 
    if condition 
     attributes["class"] = "active" 
    end 
    content_tag(:li, attributes, &block) 
    end 

По вашему мнению, вы можете просто позвонить:

 <%= nav_links %> 

Вы можете, возможно, использовать его в качестве примера.

+0

Мне это нравится. По крайней мере, после некоторой настройки для моих нужд. – Doodad

0

Я использовал кучу 'if's и current_page? метод. Это уродливо, но это сработало, если кто-то лучше подумает, как это сделать, я буду рад узнать об этом.

if current_page? (root_path) 
    content_tag(:li , link_to('Home' , root_path), :class => "active") 
else 
    content_tag(:li , link_to('Home' , root_path)) 
end