Изменение текущей вкладки в Rails - PullRequest
10 голосов
/ 18 ноября 2009

У меня есть список вкладок в верхней части моего приложения, который я включаю в общий макет в application.html.erb. Они выглядят так:

<li class="current"><%= link_to "Home", provider_path(current_user.id), :method=> "GET"%> </li>
            <li><%= link_to "Edit Profile", edit_student_path(current_user.id) %> </li>
            <li><%= link_to "Search", provider_search_path %> </li>

Я хочу изменить выбранную вкладку на «текущую», когда я нажимаю на эту страницу. Поэтому, когда я нажимаю «Изменить профиль» и загружается страница «Изменить профиль», вкладки должны выглядеть следующим образом:

<li><%= link_to "Home", provider_path(current_user.id), :method=> "GET"%> </li>
 <li class="current"><%= link_to "Edit Profile", edit_student_path(current_user.id) %> </li>
  <li><%= link_to "Search", provider_search_path %> </li>

Есть ли способ сделать это, кроме добавления JavaScript на страницу, которая отображается? Или, если есть, как правило, лучшая практика для того, чтобы делать это СУЩЕСТВЕННЫМ способом.

Спасибо

Ответы [ 8 ]

10 голосов
/ 18 ноября 2009

Вы можете использовать controller.class == и controller.action_name ==, чтобы точно определить, на каком контроллере и действии вы находитесь

так было бы что-то вроде

<li class="<%= controller.class == ProviderController and controller.action_name == 'show' ? 'current' : '' %>"><%= link_to "Home", provider_path(current_user.id), :method=> "GET"%> </li>
<li class="<%= controller.class == StudentController and controller.action_name == 'edit' ? 'current' : '' %>"><%= link_to "Edit Profile", edit_student_path(current_user.id) %> </li>
<li class="<%= controller.class == ProviderController and controller.action_name == 'search' ? 'current' : '' %>"><%= link_to "Search", provider_search_path %> </li>

Я полагаю, что есть несколько способов получить текущий URL для страницы, на которой вы находитесь, но тогда ваш "активный" стиль будет зависеть только от перехода к этому действию по этому пути, что не всегда может иметь место в зависимости от маршруты, таким образом гарантируют, что представление показывает, что является истинным, на основе того, что было фактически выполнено, а не того, что URL находится в адресной строке

6 голосов
/ 18 ноября 2009

Вы можете попробовать что-то вроде:

<li class="<%= controller.controller_path == 'provider' ? 'current' : '' %>"><%= link_to "Home", provider_path(current_user.id), :method=> "GET"%> </li>
<li class="<%= controller.controller_path == 'student' ? 'current' : '' %>"><%= link_to "Edit Profile", edit_student_path(current_user.id) %> </li>
<li class="<%= controller.controller_path == 'search' ? 'current' : '' %>"><%= link_to "Search", provider_search_path %> </li>

... и просто проверьте, с какого контроллера вы пришли.

3 голосов
/ 23 июня 2011

Взгляните на TabsOnRails

2 голосов
/ 27 октября 2010

Вы могли бы просто сделать это:

<%= current_page?(:controller => 'your_controller', :action => 'index') ? 'current' : '' %>
1 голос
/ 02 октября 2012

Я сделал для этого помощника, который может принимать любое количество аргументов, что полезно для вложенных ресурсов, но также принимает одно имя контроллера, как и другие ответы.

приложения helper.rb

 def is_active(*links)  
   links.each { |link| return "active" if params[:controller] == link }
 end

application.html.erb

<li class="<%=is_active('home')%>">...</li>

или

Пример использования с HAML & вложенным ресурсом (будет активным для любого из предоставленных имен контроллеров):

applcation.html.haml

%li{:class => is_active('blogs', 'comments')}
0 голосов
/ 25 ноября 2014

Я сделал это в приложении помощник, и, кажется, работает нормально:

def current_page(path)
  "active" if current_page?(path)
end

Тогда звоните так:

<li class="<%= current_page(root_path)%>"> <%= link_to "Home", root_path %></li>
0 голосов
/ 18 ноября 2009

Я , поэтому не утверждаю, что это лучший способ сделать это, однако я достаточно смел, чтобы опубликовать то, что я придумал:)

Некоторые примеры ссылок меню из моего макета:

<li class="nav-calendar"><%= menu_link_to 'teachers', 'show_date', 'Calendar', calendar_url  %></li>
<li class="nav-announcements"><%= menu_link_to 'announcements', nil, 'Announcements', announcements_path %></li>

Затем я создал этот помощник:

def menu_link_to(*args, &block)
  controller = args.shift
  action = args.shift

  if controller == controller_name && (action.nil? || action == action_name)
    if args.third.nil?
      args.push({:class => 'selected'})
    else
      args.third.merge!({:class => 'selected'})
    end
  end

  link_to *args, &block
end
0 голосов
/ 18 ноября 2009

Когда вы переключаете страницы, вы можете передать что-то вроде @current_tab обратно в erb из методов контроллера. Затем используйте @current_tab, чтобы решить, какой li должен быть текущим классом. В качестве альтернативы, вы можете присвоить каждому li и id или некоторому уникальному атрибуту и ​​просто изменить класс в соответствии с вашими предпочтениями JavaScript.

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