Выделите вкладку в меню - PullRequest
16 голосов
/ 06 мая 2009

У меня есть меню, которое является уль

Home | Calendar | Settings

Я хочу выделить (через класс CSS) выбранную вкладку в меню.

Некоторые ссылки (Домашняя страница и Календарь) также имеют подразделы

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

Конечно, когда выбрано событие редактирования, Календарь все равно должен быть выделен.

как мне лучше всего подойти к этому с помощью rails и css?

Спасибо

Ответы [ 5 ]

35 голосов
/ 06 мая 2009

Самый простой способ - проверить, какой контроллер используется. Я составил имена контроллеров, поэтому вы, конечно, заменили бы «home», «calendar» и «settings» правильными именами.

<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>
19 голосов
/ 06 марта 2011

В вашем файле помощника:

def is_active?(page_name)
  "active" if params[:action] == page_name
end

В файле шаблона:

link_to 'Home', '/', :class => is_active?("index")
link_to 'About', '/about', :class => is_active?("about")
link_to 'contact', '/contact', :class => is_active?("contact")

Я нашел это на: http://juliocapote.com/post/52081481/highlight-link-based-on-current-page-in-rails

5 голосов
/ 11 октября 2012

Я остановился на этом решении, которое мне очень нравится:

В помощнике

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

И в представлении определите, что делает маршрут уникальным:

<%= link_to 'Home', root_path, class: active_if(action: 'home') %>
<%= link_to 'Aricles', articles_path, class: active_if(controller: 'articles') %>
2 голосов
/ 14 апреля 2011

У меня та же проблема, и в итоге я создал помощника. в основном он заменяет хелпер link_to url, поэтому оборачивает ссылку на li и добавляет класс «menu_selected», если текущий контроллер соответствует контроллеру ссылки

пример использования

<%= 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 голос
/ 09 августа 2013

Обновление ответа @ ahmy для 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

т.е. Rails.application.routes.recognize_path вместо ActionController::Routing::Routes.recognize_path.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...