2009-05-06 30 views
16

que tiene un menú que es un ulficha Resaltar en el menú

Home | Calendar | Settings 

quiero destacar (a través de una clase CSS) en la pestaña seleccionada en el menú.

Algunos enlaces (Inicio y de calendario) también tienen subopciones

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

Por supuesto, cuando se selecciona Editar Evento, Calendario todavía debe ser resaltado.

¿cómo puedo acercarme mejor a esto usando rieles y css?

Gracias

Respuesta

35

La manera más simple sería la de comprobar qué controlador está siendo utilizado. Inventé los nombres de los controladores, así que por supuesto reemplazaría "casa", "calendario" y "configuración" con los nombres correctos.

<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

Esto es exactamente lo que he hecho antes. – Owen

+0

gracias, no pensé en el parámetro de controlador – Tarscher

2

Tengo el mismo problema y terminan creando ayudante. básicamente que reemplazar el ayudante link_to url por lo que envuelva el vínculo con Li y añadir la clase "menu_selected" si el controlador actual coincide con el controlador de enlace

Muestra el uso de

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

Agregué 'if (args [1] .is_a? (Hash)) url = url_for (args [1])' para reconocer el viejo estilo ': controller /: action' formato. – jessecurry

5

que se establecieron en esta solución que me gusta mucho:

En el ayudante

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

Y en la vista de definir lo que hace que la ruta único:

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

Esta es la mejor y más flexible solución propuesta aquí, ya que permite hacer coincidir cualquier cosa en 'params'. Obtienes mi +1. –

1

actualización a la respuesta de @ ahmy para rieles 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 

es decir, en lugar de Rails.application.routes.recognize_pathActionController::Routing::Routes.recognize_path.