Динамически добавлять активный класс в bootstrap li в Rails
в панели навигации начальной загрузки. Вы можете получить эффект нажатия кнопки, добавив класс active
. Естественно, я хочу использовать это на своих страницах. Например,если я на странице о нас, я хочу, чтобы кнопка о нас нажата.
каков наилучший способ сделать это? Я собирался перейти на каждую страницу и внизу есть функция jQuery добавить класс active
к нему. Есть ли лучший способ?
7 ответов
читать про current_page?
здесь
вы можете добавить метод для логики обработки с помощью current_page?
, например метод :
module ApplicationHelper
def active_class(link_path)
current_page?(link_path) ? "active" : ""
end
end
пример загрузочный navbar шаблон
<div class="navbar">
<div class="navbar-inner">
<a class="brand" href="#">Title</a>
<ul class="nav">
<li class="active"><a href="#">Home</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
</ul>
</div>
</div>
так, на взгляд, выглядит так:
HTML-код
<li class="<%= active_class(some_path) %>">
<%= link_to "text of link", some_path %>
</li>
Haml на
%li{:class => active_class(some_path)}
= link_to "text of link", some_path
или вы можете использовать request.fullpath
как получить полный путь если текущие путь параметр
пример
<ul>
<% Contry.all.each do |c| %>
<li class="snavitem <%= active_class(contry_path(c)) %>">
<%= link_to "show #{c.name}", contry_path(c) %>
</li>
<% end %>
</ul>
и на application_helper.rb
def active_class(link_path)
request.fullpath == link_path ? "active" : ""
end
читать о просьбе.пути здесь
на мой взгляд, более чистый способ достичь этого-написать link_to_in_li
метод в application_helper.rb:
def link_to_in_li(body, url, html_options = {})
active = "active" if current_page?(url)
content_tag :li, class: active do
link_to body, url, html_options
end
end
тогда используйте его таким образом
<%= link_to_in_li "Home", root_path, id: "home_link" %>
Я нахожу код внутри li
немного трудно читать.
для тех, у кого возникли проблемы с пониманием этого, вот пример с моими путями и именами файлов, изложенными явно. Как довольно новый человек для rails, мне было трудно понять это. Спасибо другим людям, которые ответили выше, так как это помогло мне понять это!
Я разместил загрузочную панель navbar в своем приложении.формат html.erb файл:
<div class="navbar-header">
<a class="navbar-brand" href="/">Mapper</a>
<ul class="nav navbar-nav">
<li class="<%= is_active?('/') %>"><%= link_to "Home", '/' %></li>
<li class="<%= is_active?('/main/map') %>"><%= link_to "Map", '/main/map' %></li>
<li class="<%= is_active?('/main/about') %>"><%= link_to "About", '/main/about' %></li>
</ul>
</div>
это идет в application_helper.файл rb:
module ApplicationHelper
def is_active?(link_path)
current_page?(link_path) ? "active" : ""
end
end
вот именно! Теперь ваше приложение будет динамически добавьте "активный" класс на любую просматриваемую страницу (т. е. соответствующий элемент списка на панели навигации). Это намного проще (и более сухо), чем добавление панели навигации вручную на каждую страницу (представление), а затем обновление класса "active".
я опубликую свой ответ, который я создал на основе этих других, потому что в случае представлений CRUD активный класс не был помещен.
module ApplicationHelper
def active_class(name)
controller_name.eql?(name) || current_page?(name) ? 'active' : ''
end
end
мои взгляды используют что-то вроде этого:
<ul class="nav navbar-nav">
<li class="nav-item <%= active_class('/') %>">
<a class="nav-link" href="/">Home</a>
</li>
<li class="nav-item <%= active_class('leads') %>">
<a class="nav-link" href="/leads">Leads</a>
</li>
</ul>
<ul class="nav navbar-nav pull-right <%= active_class(edit_user_registration_path) %>">
<li class="nav-item ">
<a class="nav-link" href="/users/edit">Perfil</a>
</li>
<li class="nav-item">
<%= link_to('Sair', destroy_user_session_path, method: :delete) %>
</li>
</ul>
пожалуйста, попробуйте это на каждой странице, проверьте cotroller или действие и добавьте css
например:
<li class= <%= (controller.controller_name.eql?('pages') && controller.action_name.eql?('index') )? 'active':''%> ><%= link_to 'my page', pages_path%></li>
вы можете определить вспомогательный метод, в application_helper.rb
def 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>
идеально подходит для bootstrap навигации!
зачем ограничивать себя только li
элементов? И почему бы не поддерживать несколько имен классов вместе с active
? Это решение позволяет мне:
- поддержка не только обычного текста, но и HTML внутри
link_to
(напр. добавить значок внутри Ссылка) - добавить всего несколько строк кода
application_helper.rb
- добавить
active
для всего имени класса элемента link вместо того, чтобы быть единственным классом.
Итак, добавьте это в application_helper.rb
:
def active_class?(class_name = nil, path)
class_name ||= ""
class_name += " active" if current_page?(path)
class_name.strip!
return class_name
end
и на вашем шаблоне вы можете иметь что-то вроде этого:
<div class="col-xs-3">
<%= link_to root_path, :class => active_class?("btn btn-outline-primary", root_path) do %>
<i class="fa fa-list-alt fa-fw"></i>
<% end %>
</div>
вы также можете указать или нет class_name
и используйте его так:
<li class="<%= active_class?(root_path) %>">Home</li>