抱歉,我不知道标题应该是什么,所以有人请把它改成最适合我的问题。
基本上,我有一个这样的列表:
<li class="active"><%= link_to "Home", root_path %></li>
<li><%= link_to "About", about_path %></li>
<li><%= link_to "Contact", contact_path %></li>
根据我所在的页面(Home,About,Contant),我希望相应的<li>
标记具有class="active"
属性。最好的方法是什么?
我有一个类变量@title设置为正在导航的任何页面。
答案 0 :(得分:11)
使用current_page?(options)
来了解控制器/ action / params是否与url相对应,并根据该值切换类,例如:像这样的帮手(未经测试):
def nav_item(name, path)
if current_page?(path)
@title = name
end
content_tag('li', :class=>(current_page?(path) ? 'active' : nil) ){link_to(name,path)}
end
<%= nav_item 'Home', root_path %>
<%= nav_item 'About', about_path %>
<%= nav_item 'Contact', contact_path %>
答案 1 :(得分:4)
使用link_to_unless_current
帮助程序。你需要稍微不同的css,但这是值得的。您不必担心@title
等,并且您不会得到当前页面的混乱链接。例如,使用:
<nav>
<% [["Home", :home], ["About", :about], ["Contact", :contact]].each do |name,url| %>
<li><%= link_to_unless_current(name, url) %></li>
<% end %>
</nav>
然后,假设您希望“活动”案例为粗体和绿色,请使用此CSS:
nav li { /* active case */
font-weight: bold;
color: green;
}
nav li a { /* normal, link case */
font-weight: normal;
color: blue;
}
答案 2 :(得分:-1)
在application_controller.rb
中使用前置过滤器来实例化当前控制器和操作。
# application_controller.rb
before_filter :instantiate_controller_and_action_names
def instantiate_controller_and_action_names
@current_action = action_name
@current_controller = controller_name
end
如果该链接的操作和控制器是最新的,则定义一个帮助程序以生成与css类集的链接。
module ApplicationHelper
def section_link_to(name, url_options, html_options = {})
if action.eql?(@current_action) and controller.eql?(@current_controller)
link_to(name, url_options, html_options, :class => 'current')
else
link_to(name, url_options, html_options)
end
end
end
定义你的css以突出显示活动链接:
nav li.active { /* current */
font-weight: bold;
background: green;
}
希望这有帮助。