2009-05-06 14 views
16

J'ai un menu qui est un ulonglet Mettez en surbrillance dans le menu

Home | Calendar | Settings 

Je veux souligner (via une classe css) l'onglet sélectionné dans le menu.

Quelques liens (Accueil et Calendrier) ont également

sous-sélections
Home | *Calendar* | Settings 
------------------------- 
Add event | Edit event 

Ofcourse lorsque l'événement d'édition est sélectionné, le calendrier devrait être mis en évidence encore.

comment est-ce que je peux approcher au mieux cela en utilisant des rails et css?

Merci

Répondre

35

La façon la plus simple serait de vérifier quel contrôleur est utilisé. J'ai créé des noms de contrôleurs, donc bien sûr, vous remplaceriez «home», «calendar» et «settings» par les noms corrects.

<ul> 
    <li class="<%= "highlighted" if params[:controller] == "home" %>">Home</li> 
    <li class="<%= "highlighted" if params[:controller] == "calendar" %>">Calendar</li> 
    <li class="<%= "highlighted" if params[:controller] == "settings" %>">Settings</li> 
</ul> 
+0

C'est exactement ce que j'ai fait auparavant. – Owen

+0

merci, n'a pas pensé au paramètre du contrôleur – Tarscher

2

J'ai le même problème et finissent par créer assistant. basiquement, il remplace l'assistant url link_to il envelopper le lien avec li et ajouter la classe « menu_selected » si le régulateur de courant correspond au contrôleur de liaison

exemple d'utilisation

<%= menu_link_to "Home", home_path %> 

def menu_link_to(*args, &block) 
    url = args[1] 
    mapping = ActionController::Routing::Routes.recognize_path(url) 

    class_property = "menu_selected" if mapping[:controller] == controller.controller_path 
    content_tag :li, :class => class_property do 
    link_to *args, &block 
    end 
end 
 
+1

J'ai ajouté 'if (args [1] .is_a? (Hash)) url = url_for (args [1])' pour reconnaître l'ancien style ': controller /: action' format. – jessecurry

5

je me suis installé sur cette solution ce qui me plaît beaucoup:

Dans l'assistant

def active_if(options) 
    if params.merge(options) == params 
    'nav-active' 
    end 
end 

Et dans la vue définir ce qui rend le parcours unique:

<%= link_to 'Home', root_path, class: active_if(action: 'home') %> 
<%= link_to 'Aricles', articles_path, class: active_if(controller: 'articles') %> 
+0

C'est la solution la meilleure et la plus flexible proposée ici car elle permet de faire correspondre n'importe quoi dans 'params'. Vous obtenez mon +1. –

1

mise à jour à la réponse de @ ahmy pour Rails 3.2:

def menu_list_item(*args, &block) 
    url = args[1] 
    mapping = Rails.application.routes.recognize_path(url) 

    li_class = 'active' if mapping[:controller] == controller.controller_path 
    content_tag :li, :class => li_class do 
    link_to *args, &block 
    end 
end 

dire Rails.application.routes.recognize_path au lieu de ActionController::Routing::Routes.recognize_path.

Questions connexes