在引导导航栏中。您可以通过添加类来获得单击按钮的效果active
。自然,我想在我的页面上使用它。例如,如果我在关于我们的页面上,我希望点击关于我们的按钮。
解决此问题的最佳方法是什么?我要去每个页面,在底部有一个 jQuery 函数将类添加active
到它。有没有更好的办法?
在引导导航栏中。您可以通过添加类来获得单击按钮的效果active
。自然,我想在我的页面上使用它。例如,如果我在关于我们的页面上,我希望点击关于我们的按钮。
解决此问题的最佳方法是什么?我要去每个页面,在底部有一个 jQuery 函数将类添加active
到它。有没有更好的办法?
在这里阅读current_page?
您可以使用以下方法添加处理逻辑current_page?
的方法,例如方法:
module ApplicationHelper
def active_class(link_path)
current_page?(link_path) ? "active" : ""
end
end
示例引导导航栏模板
<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
在此处阅读有关 request.fullpath的信息
在我看来,实现这一目标的一种更简洁的方法是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 的新手,我很难弄清楚。感谢上面回答的其他人,因为它帮助我弄清楚了!
我将 Bootstrap 导航栏放在我的 application.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
就是这样!现在,您的应用程序将动态地将“活动”类添加到当前正在查看的任何页面(即,它是导航栏中的相应列表项)。这比手动将导航栏添加到每个页面(视图)然后更新“活动”类要简单得多(也更干燥)。
我将发布我基于这些其他人创建的答案,因为在 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>
请在每个页面中尝试此操作,检查控制器或操作并添加 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>
非常适合引导导航!
为什么要将自己限制在li
元素上?为什么不支持多个类名active
呢?这个解决方案让我:
link_to
(例如在链接内添加图标)application_helper.rb
active
到链接元素的整个类名,而不是作为唯一的类。因此,将其添加到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>
您还可以指定或不指定 aclass_name
并像这样使用它:
<li class="<%= active_class?(root_path) %>">Home</li>