2012-06-17 2 views
1

У меня есть панель навигации, которая является неупорядоченным списком с вкладками в качестве элементов списка. Я рисую каждую отдельную вкладку (элемент списка) с помощью помощника вида. Я хочу применить класс 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> вида.

ответ

0

Вы могли бы попробовать это просто определить методы помощника приложения и назовите его, передавая уникальную строку для каждого списка навигации

def active_class(css_class) 

    if controller.controller_name == css_class || css_class == "#{controller.controller_name}##{controller.action_name}" || css_class == inner_classes 
     return "active" 
    else 
     return "" 
    end 
    end 


    def inner_classes 
    pages = { 
     "basic_files#new_part_price_file" => "basic_files#index", 
     "basic_files#new_market_basket_file" => "basic_files#index", 
     "basic_files#create" => "basic_files#index", 
     "basic_files#edit" => "basic_files#index", 
     "basic_files#show" => "basic_files#index", 
     "basic_files#uploads" => "basic_files#index", 
     "basic_files#downloadable_part_price_file" => "basic_files#download_page", 
     "basic_files#downloadable_market_basket_file" => "basic_files#download_page", 
     "basic_files#download_part_price_file" => "basic_files#download_page", 
     "basic_files#download_market_basket_file" => "basic_files#download_page", 
    } 
    pages["#{controller.controller_name}##{controller.action_name}"] 
    end 

По мнению можно назвать вышеуказанные методы, как это

<%= link_to 'Home',home_path,:class => "f1 #{active_class('home')}" %> 

    <% if current_user.publisher? %> 
    <%= link_to 'User',users_path,:class => "f1 #{active_class('users')}" %> 
    <%= link_to 'Upload',basic_files_path,:class => "f1 #{active_class('basic_files#index')}" %> 
    <%= link_to 'Publish',publish_completed_basic_files_path,:class => "f1 #{active_class('basic_files#publish_completed')}" %> 
    <%= link_to 'Report',audits_path ,:class => "f1 #{active_class('audits')}" %> 

Note it just a example of how you can build automatic navigation highlighting

Смежные вопросы