У меня есть панель навигации, которая является неупорядоченным списком с вкладками в качестве элементов списка. Я рисую каждую отдельную вкладку (элемент списка) с помощью помощника вида. Я хочу применить класс active
для каждого из них на основе значения, предоставленного представлением. Это возможно?Текущая вкладка в навигационной панели
Чтобы разработать на помощник вида я мог бы что-то вроде:
def tab_item(tab)
content_tag :li, :class => ('active' if some_variable == tab) do
link_to tab, "/#{tab}"
end
end
И в определенной точки зрения, я хотел бы сделать:
<% somehow_set_some_variable('dash') %>
Это то сделать бы так, что some_variable
в view helper is 'dash'
, что делает его таким, что эта вкладка получает класс 'active'
.
Возможно ли это в любом случае? Если нет, есть ли другой подход к этой проблеме? Должен ли я просто установить переменную на контроллере?
Я уже видел статьи и вопросы, которые основывают решение на основе текущего контроллера и/или действия, но это слишком ограничительно, поэтому я смотрю, могу ли я принять этот подход. Еще одно решение, которое я придумал, состоит в том, чтобы сгенерировать весь список вкладок в одном помощнике вида, который принимает аргумент для активируемой вкладки, и я вызываю это в каждом из представлений. Однако я предпочел бы генерировать список в макетах и активировать вкладку для каждого представления.
Обходной путь: До сих пор я придумал компромисс, не зная способ сделать то, что я задал в этом вопросе. Помощник приложения создает тэг li
и применяет activate
, если переданный аргумент помощнику приложения соответствует переменной экземпляра @activate
.
def nav_tab(tab)
content_tag :li, :id => tab, :class => ('active' if tab == @activate) do
link_to tab, "/#{tab}"
end
end
Затем в действиях контроллера я просто установить эту переменную, например:
def index
# ...
@activate = 'dash'
end
Это работает, и это имеет эффект, который я искал: бар нав генерируется независимо, а затем каждый ' действие "может указать, какую вкладку активировать, , если они хотят.
Я не уверен, что это лучшее решение этой проблемы. Я пытался сохранить этот материал во взглядах, например this question, который выполняет это для изменений <title>
вида.