2009-05-06 9 views
16

Ich habe ein Menü, das ein ulHighlight Registerkarte Menü

Home | Calendar | Settings 

I (über eine CSS-Klasse), um die ausgewählten Registerkarte im Menü markieren will.

Einige Links (Heim und Kalender) haben auch subselections

Home | *Calendar* | Settings 
------------------------- 
Add event | Edit event 

Ofcourse wenn bearbeiten Veranstaltung ausgewählt, Kalender noch hervorgehoben werden sollte.

Wie kann ich das am besten mit Schienen und CSS erreichen?

Dank

Antwort

35

Der einfachste Weg, um zu überprüfen wäre, welcher Controller verwendet wird. Ich habe Controller-Namen erstellt, also würden Sie "Home", "Kalender" und "Einstellungen" natürlich mit den richtigen Namen ersetzen.

<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

Genau so habe ich es schon mal gemacht. – Owen

+0

danke, dachte nicht an den Controller-Parameter – Tarscher

2

Ich habe das gleiche Problem und am Ende der Schaffung Helfer. basicly den link_to url Helfer ersetzen, so dass es die Verbindung mit li und fügen Klasse wrap „menu_selected“, wenn der Stromregler der Verbindungscontroller

usage sample

<%= 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

Ich fügte 'if (args [1] .is_a? (Hash)) url = url_for (args [1])' 'den alten Stil zu erkennen': controller /: action' Format. – jessecurry

5

Spiele ich auf diese Lösung angesiedelt die Ich mag eine Menge:

im Helfer

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

Und in der Ansicht zu definieren, was die Strecke einzigartig macht: Antwort

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

Dies ist die beste und flexibelste Lösung, die hier vorgeschlagen wird, da sie es ermöglicht, auf alles in 'params' zu passen. Du bekommst meine +1. –

1

Update @ ahmy der für 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 

heißt Rails.application.routes.recognize_path statt ActionController::Routing::Routes.recognize_path.