更改rails中当前页面导航链接的类

时间:2011-12-21 07:58:48

标签: ruby-on-rails ruby

抱歉,我不知道标题应该是什么,所以有人请把它改成最适合我的问题。

基本上,我有一个这样的列表:

<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设置为正在导航的任何页面。

3 个答案:

答案 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;
}

希望这有帮助。