我不了解Twitter Bootstrap如何为导航执行活动链接。如果我有这样的常规导航(在铁轨链接上使用ruby):
<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>
如何根据点击的链接保持活动状态?
答案 0 :(得分:93)
刚才在这个问题上回答了同样的问题 Twitter Bootstrap Pills with Rails 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>
答案 1 :(得分:46)
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>
答案 2 :(得分:31)
我使用帮助器以Rails&#39;的方式实现这一点。帮助者。
在帮助程序中(例如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 %>
此示例生成(在&#39;用户&#39;页面上):
<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>
答案 3 :(得分:22)
使用此选项可根据当前路线选择导航中的活动链接,而无需服务器代码:
$(document).ready(function () {
$('a[href="' + this.location.pathname + '"]').parent().addClass('active');
});
答案 4 :(得分:11)
我在 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
答案 5 :(得分:5)
对于每个链接:
<% 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>
答案 6 :(得分:3)
不确定您是在询问如何使用twitter bootstrap css,还是使用rails侧。我正在考虑铁路方面。
如果是,请结帐#link_to_if
方法
或#link_to_unless_current
方法
答案 7 :(得分:3)
今天我遇到了同样的问题/问题,但采用了其他方法来解决问题。 我在application_helper.rb中创建了一个辅助函数:
def navMainAktiv(actionName)
if params[:action] == actionName
"active"
end
end
,链接如下:
<li class="<%= navMainAktiv('about')%>"><%= link_to "About", about_path %></li>
您可以将params[:action]
替换为params[:controller]
,并在链接中设置您的控制器名称。
答案 8 :(得分:2)
您可以在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>
希望它有所帮助!
答案 9 :(得分:2)
我对每个li
:
<li><%= link_to_unless_current('Home', root_path) { link_to('Home', root_path, class: 'active') } %></li>
答案 10 :(得分:1)
你应该通过操纵CSS类来自己完成。也就是说,如果用户点击某个链接,然后执行某些操作(目标操作),将上一个链接设置为非活动状态并激活新链接。
如果您的链接将您带到服务器(即,重新加载页面),那么您只需在服务器上正确呈现活动链接即可。否则,如果你正在做一些客户端的东西(切换标签窗格或其他),你必须使用javascript。
答案 11 :(得分:1)
已经有很多答案,但这是我为了让Bootstrap Icons与主动链接一起工作所写的内容。希望它会帮助某人
这个助手会给你:
将它放在您的application_helper.rb
中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' %>
答案 12 :(得分:1)
这里的许多答案都有可行的方法或部分答案。我结合了很多东西来制作我使用的rails helper方法:
# 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
通过参数检查可以使其更加漂亮,以支持link_to等上的&block
。
答案 13 :(得分:1)
当您可以在current_page?
哈希中指定自定义class
名称时,我使用build in helper 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>
答案 14 :(得分:1)
答案 15 :(得分:0)
您听起来需要实施导航系统。如果它很复杂,它可能会变得相当丑陋且相当快。
在这种情况下,您可能希望使用可以处理该插件的插件。您可以使用navigasmic或simple navigation(我建议使用navigasmic,因为它会将主图层保留在视图中,它所属的位置,而不是某些配置中)
答案 16 :(得分:0)
这涉及BOTH导航和子导航列表元素。您可以将数组传递给单个路径,并且可以处理这两个路径。
# Active page method
def ap(p:);'active' if p.class == Array ? p.map{|m| current_page? m}.any? : (current_page? p) end
<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>
答案 17 :(得分:0)
在Sinatra上使用ruby ..
我使用bootstrap裸主题,这是示例导航条代码。注意元素的类名 - &gt; .nav - 这是在java脚本中引用的。
/ 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 view snippet - &gt;
- content_for :javascript do
:javascript
$(function () {
$.each($('.nav').find('li'), function() {
$(this).toggleClass('active',
$(this).find('a').attr('href') == window.location.pathname);
});
});
在javascript调试器中,确保'href'属性的值与window.location.pathname匹配。这与@Zitrax的解决方案略有不同,后者帮助我解决了我的问题。
答案 18 :(得分:0)
基本,没有助手
<%= 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 %>
答案 19 :(得分:0)
这就是我的所作所为:
我创建了一个ViewsHelper并包含在ApplicationController中:
include ViewsHelper
Inside ViewsHelper我创建了一个这样的简单方法:
def page_state(path)
current_page?(path) ? 'active' : ''
end
在我看来,我这样做:
<li class="<%= page_state(foobar_path) %>"><%= link_to 'Foobars', foobar_path %></li>
答案 20 :(得分:0)
def active_navigation?(controllers_name, actions_name)
'active' if controllers_name.include?(controller_name) && actions_name.include?(action_name)
end
纤细
li class=(active_navigation?(['events'], ['index', 'show'])) = link_to t('navbar.events'), events_path
答案 21 :(得分:0)
这对我有用:
SELECT *
FROM Dummy_tab_2
UNION
SELECT *
FROM Dummy_tab_1
<li class="nav-item <%= 'active' if current_page?(root_path) %>" >
<%= link_to 'Home', root_path, class:"nav-link"%>
</li>
<li class="nav-item <%= 'active' if current_page?(tools_path) %>" >
<%= link_to 'Tools', tools_path, class:"nav-link" %>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Request a new tool</a>
</li>
<li class="nav-item <%= 'active' if current_page?(home_about_path) %>" >
<%= link_to 'About us', home_about_path, class:"nav-link"%>
</li>
中的代码只是 <%= %>
,而 ruby
表示该代码的结果将显示在 HTML 中。为您要添加的每个选项执行此操作在您的导航栏中,它应该可以正常工作。