Как получить Twitter-Bootstrap навигации, чтобы показать активную ссылку?
Я не понимаю, как Twitter Bootstrap делает активные ссылки для навигации. Если у меня есть обычная навигация, как это (с ruby on rails linking):
<ul class="nav">
<li class="active"> <a href="/link">Link</a> </li>
<li class=""> <a href="/link">Link</a> </li>
<li class=""> <a href="/link">Link</a> </li>
</ul>
Как мне сохранить его активным на основе ссылки нажал?
22 ответов:
просто сделал ответ на тот же вопрос здесь Twitter Bootstrap таблетки с рельсами 3.2.2
<ul class="nav"> <li class="<%= 'active' if params[:controller] == 'controller1' %>"> <a href="/link">Link</a> </li> <li class="<%= 'active' if params[:controller] == 'controller2' %>"> <a href="/link">Link</a> </li> <li class="<%= 'active' if params[:controller] == 'controller3' %>"> <a href="/link">Link</a> </li> </ul>
вы можете использовать что-то вроде (очень похоже на то, что упоминал @phil, но немного короче):
<ul class="nav"> <li class="<%= 'active' if current_page?(root_path) %>"><%= link_to "Home", root_path %></li> <li class="<%= 'active' if current_page?(about_path) %>"><%= link_to "About", about_path %></li> <li class="<%= 'active' if current_page?(contact_path) %>"><%= link_to "Contact", contact_path %></li> </ul>
https://github.com/twg/active_link_to
<%= active_link_to 'Users', users_path, :wrap_tag => :li %>
#=> <li class="active"><a href="/users">Users</a></li>
я использовал помощника для реализации этого в стиле Rails ' form helpers.
в помощнике (например,
app/helpers/ApplicationHelper.rb):def nav_bar content_tag(:ul, class: "nav navbar-nav") do yield end end def nav_link(text, path) options = current_page?(path) ? { class: "active" } : {} content_tag(:li, options) do link_to text, path end endзатем, в виду (например,
app/views/layouts/application.html.erb):<%= nav_bar do %> <%= nav_link 'Home', root_path %> <%= nav_link 'Posts', posts_path %> <%= nav_link 'Users', users_path %> <% end %>этот пример производит (когда на странице "пользователи"):
<ul class="nav navbar-nav"> <li><a href="/">Home</a></li> <li><a href="/posts">Posts</a></li> <li class="active"><a href="/users">Users</a></li> </ul>
используйте это вместо того, чтобы выбрать активную ссылку в nav на основе текущего маршрута без кода сервера:
$(document).ready(function () { $('a[href="' + this.location.pathname + '"]').parent().addClass('active'); });
Я нашел успех, используя логические и (
&&) в haml:%ul.nav %li{class: current_page?(events_path) && 'active'} = link_to "Events", events_path %li{class: current_page?(about_path) && 'active'} = link_to "About Us", about_path
для каждой ссылки:
<% if current_page?(home_path) -%><li class="active"><% else -%><li><% end -%> <%= link_to 'Home', home_path %> </li>или даже
<li <% if current_page?(home_path) -%>class="active"<% end -%>> <%= link_to 'Home', home_path %> </li>
не уверен, что вы спрашиваете о том, как используется css bootstrap twitter или сторона rails. Я предполагаю, что рельсы стороне.
если так оформить
#link_to_ifспособ или#link_to_unless_currentметод
сегодня у меня был тот же вопрос/проблема, но с другим подходом к решению. Я создаю вспомогательную функцию в application_helper.РБ:
def navMainAktiv(actionName) if params[:action] == actionName "active" end endи ссылка выглядит так:
<li class="<%= navMainAktiv('about')%>"><%= link_to "About", about_path %></li>вы можете заменить
params[:action]Сparams[:controller]и указать имя контроллера в ссылке.
Я использую это для каждого
li:
<li><%= link_to_unless_current('Home', root_path) { link_to('Home', root_path, class: 'active') } %></li>
вы можете определить вспомогательный метод, в
application_helper.rbdef create_link(text, path) class_name = current_page?(path) ? 'active' : '' content_tag(:li, class: class_name) do link_to text, path end endтеперь вы можете использовать как:
create_link 'xyz', any_pathкоторый будет отображаться как<li class="active"> <a href="/any">xyz</a> </li>надеюсь, что это помогает!
вы должны сделать это самостоятельно, манипулируя классами CSS. То есть, если пользователь нажимает на какую-то ссылку, то сделайте что-то (целевое действие), установите предыдущую ссылку неактивной и новую ссылку активной.
Если ваши ссылки приведут вас на сервер (то есть, перезагрузите страницу), вы можете просто правильно отобразить активную ссылку на сервере. В противном случае, если вы делаете некоторые вещи на стороне клиента (переключение вкладок или что-то еще), вы должны использовать javascript.
Я написал простой вспомогательный метод, используя build in view helper
current_page?когда вы можете указать customclassимяhtml_optionsхэш.def active_link_to(name = nil, options = nil, html_options = nil, &block) active_class = html_options[:active] || "active" html_options.delete(:active) html_options[:class] = "#{html_options[:class]} #{active_class}" if current_page?(options) link_to(name, options, html_options, &block) endпримеры (когда вы находитесь на
root_pathмаршрут):<%= active_link_to "Main", root_path %> # <a href="/" class="active">Main</a> <%= active_link_to "Main", root_path, class: "bordered" %> # <a href="/" class="bordered active">Main</a> <%= active_link_to "Main", root_path, class: "bordered", active: "disabled" %> # <a href="/" class="bordered disabled">Main</a>
многие ответы здесь есть вещи, которые будут работать, или частичные ответы. Я объединил кучу вещей, чтобы сделать этот вспомогательный метод rails, который я использую:
# helper to make bootstrap3 nav-pill <li>'s with links in them, that have # proper 'active' class if active. # # the current pill will have 'active' tag on the <li> # # html_options param will apply to <li>, not <a>. # # can pass block which will be given to `link_to` as normal. def bootstrap_pill_link_to(label, link_params, html_options = {}) current = current_page?(link_params) if current html_options[:class] ||= "" html_options[:class] << " active " end content_tag(:li, html_options) do link_to(label, link_params) end endЭто может быть сделано еще более причудливым с проверкой аргументов для поддержки
&blockна link_to и т. д.
многие ответы уже есть, но вот что я написал, чтобы получить Bootstrap иконки, работающие с активной ссылкой. Надеюсь, это поможет кому-то
этот помощник даст вам:
- li элемент со ссылкой, содержащей пользовательский текст
- Дополнительный Значок Bootstrap3
- станет активным, когда вы находитесь на правой странице
поместите это в свой application_helper.РБ
def nav_link(link_text, link_path, icon='') class_name = current_page?(link_path) ? 'active' : '' icon_class = "glyphicon glyphicon-" + icon content_tag(:li, :class => class_name) do (class_name == '') ? (link_to content_tag(:span, " "+link_text, class: icon_class), link_path) : (link_to content_tag(:span, " "+link_text, class: icon_class), '#') end endи использовать ссылке:
<%= nav_link 'Home', root_path, 'home' %>последние аргумент необязателен-он добавит значок в ссылку. Используйте имена значков глифа. Если вы хотите значок без текста:
<%= nav_link '', root_path, 'home' %>
вы говорите, что вам нужно реализовать навигационную систему. Если это сложно, это может стать довольно уродливым и довольно быстро.
в этом случае, вы можете использовать плагин, который может справиться с этим. Вы могли бы использовать navigasmic или простая навигация (Я бы рекомендовал navigasmic, потому что он сохраняет основной слой в представлении, где он принадлежит, а не в какой-то конфигурации)
короткий код
это касается как nav, так и элементов списка sub nav. Вы можете передать любой массив по одному пути и будете иметь дело с обоими.
application_helper
# Active page method def ap(p:);'active' if p.class == Array ? p.map{|m| current_page? m}.any? : (current_page? p) endview (html.erb)
<ul class="nav navbar-nav"> <li class="<%= ap p: home_path %>">Home</li> <li class="<%= ap p: account_path %>">Account</li> <li class="dropdown <%= ap p: [users_path, new_user_path] %>"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Users</a> <ul class="dropdown-menu" role="menu"> <li class="<%= ap p: users_path %>">Users</li> <li class="<%= ap p: new_user_path %>">Add user</li> </ul> </li> </ul>
использование Рубина на Синатре ..
Я м, используя тема ушко чуть-чуть, вот пример кода навигации. Обратите внимание на имя класса элемента -> .nav-как это называется в Java script.
/ Collect the nav links, forms, and other content for toggling #bs-example-navbar-collapse-1.collapse.navbar-collapse %ul.nav.navbar-nav %li %a{:href => "/demo/one"} Page One %li %a{:href => "/demo/two"} Page Two %li %a{:href => "/demo/three"} Page Threeна странице просмотра (или частично) добавьте это: javascript, это должно выполняться каждый раз при загрузке страницы.
haml посмотреть фрагмент ->
- content_for :javascript do :javascript $(function () { $.each($('.nav').find('li'), function() { $(this).toggleClass('active', $(this).find('a').attr('href') == window.location.pathname); }); });в отладчике javascript убедитесь, что значение атрибута' href ' совпадает с окно.местоположение.имя пути. Это немного отличается от решения @Zitrax, которое помогло мне решить мою проблему.
Основной, Без Помощника
<%= content_tag(:li, class: ('active' if request.path == '/contact')) do %> <%= link_to 'Contact', '/contact' %> <% end %>Я использую это, так как у меня есть более чем один класс -
<%= content_tag(:li, class: (request.path == '/contact' ? 'active black' : 'black')) do %> <%= link_to 'Contact', '/contact' %> <% end %>
вот что я сделал:
Я создал ViewsHelper и включен в ApplicationController:
include ViewsHelperInside ViewsHelper я создал простой метод, как это:
def page_state(path) current_page?(path) ? 'active' : '' endна мой взгляд я делаю это:
<li class="<%= page_state(foobar_path) %>"><%= link_to 'Foobars', foobar_path %></li>
def active_navigation?(controllers_name, actions_name) 'active' if controllers_name.include?(controller_name) && actions_name.include?(action_name) endslim
li class=(active_navigation?(['events'], ['index', 'show'])) = link_to t('navbar.events'), events_path
Comments