在Rails 3中为nav添加"当前"类的最佳方法

Pet*_*ong 110 navigation ruby-on-rails-3

我在导航菜单中有一些静态页面.我想在当前显示的项目中添加类似"当前"的类.

我这样做的方法是添加大量的辅助方法(每个项目一个)来检查控制器和操作.

def current_root_class
  'class="current"' if controller_name == "homepage" && action_name == "index" 
end

<ul>
  <li <%= current_root_class %>><%= link_to "Home", root_path %>
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢??我目前的方式是如此愚蠢......

Ski*_*ick 287

我做了一个叫做帮手nav_link:

def nav_link(link_text, link_path)
  class_name = current_page?(link_path) ? 'current' : ''

  content_tag(:li, :class => class_name) do
    link_to link_text, link_path
  end
end
Run Code Online (Sandbox Code Playgroud)

用过:

nav_link 'Home', root_path
Run Code Online (Sandbox Code Playgroud)

这将生成HTML之类的

<li class="current"><a href="/">Home</a></li>
Run Code Online (Sandbox Code Playgroud)

  • 更改为class_name = current_page?(link_path)?'current':如果您不希望在不在当前页面上时显示类标记,则为nil (41认同)
  • 干如沙漠 (9认同)
  • 如果您使用的是twitter bootstrap导航栏http://twitter.github.com/bootstrap/examples/hero.html,这对于twitter ootstrap很有效. (3认同)

jpe*_*thy 71

使用current_page?帮助程序确定是否应该分配"current"类.例如:

<%= 'active' if current_page?(home_about_path) %>
Run Code Online (Sandbox Code Playgroud)

注意,您也可以传递路径(不仅是选项的散列),例如:current_page?(root_path).

  • 有没有办法让这个忽略查询参数? (3认同)

Yan*_*nis 56

这里不是真正的答案,因为我使用的方式和你一样.我刚刚定义了帮助方法来测试多个控制器或操作:

在application_helper.rb中

  def controller?(*controller)
    controller.include?(params[:controller])
  end

  def action?(*action)
    action.include?(params[:action])
  end
Run Code Online (Sandbox Code Playgroud)

然后你可以if controller?("homepage") && action?("index", "show")在你的视图或其他帮助方法中使用...


小智 26

我在application_helper.rb(Rails 3)中使用这个nav_link(文本,链接)函数来完成工作,并为我滚动我的bootstrap twitter 2.0导航栏链接.

def nav_link(text, link)
    recognized = Rails.application.routes.recognize_path(link)
    if recognized[:controller] == params[:controller] && recognized[:action] == params[:action]
        content_tag(:li, :class => "active") do
            link_to( text, link)
        end
    else
        content_tag(:li) do
            link_to( text, link)
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

例:

<%=nav_link("About Us", about_path) %>
Run Code Online (Sandbox Code Playgroud)


ful*_*ked 10

我这样做的方法是在application_helper中添加一个辅助函数

def current_class?(test_path)
  return 'current' if request.request_uri == test_path
  ''
end
Run Code Online (Sandbox Code Playgroud)

然后在导航中,

<%= link_to 'Home', root_path, :class => current_class?(root_path) %>
Run Code Online (Sandbox Code Playgroud)

这将测试针对当前页面uri的链接路径,并返回当前类或空字符串.

我没有对此进行过彻底的测试,而且我对RoR非常陌生(在PHP使用了十年之后),所以如果这有一个重大缺陷,我很乐意听到它.

至少这样你在每个链接中只需要1个辅助函数和一个简单的调用.


The*_*ler 6

要建立@Skilldrick的答案......

如果您将此代码添加到application.js,它将确保具有活动子项的任何下拉菜单也将标记为活动...

$('.active').closest('li.dropdown').addClass('active');
Run Code Online (Sandbox Code Playgroud)

要回顾支持代码>添加一个名为nav_link的帮助器:

def nav_link_to(link_text, link_path)
  class_name = current_page?(link_path) ? 'active' : ''

  content_tag(:li, :class => class_name) do
    link_to link_text, link_path
  end
end
Run Code Online (Sandbox Code Playgroud)

用过:

nav_link_to 'Home', root_path
Run Code Online (Sandbox Code Playgroud)

这将生成HTML之类的

<li class="active"><a href="/">Home</a></li>
Run Code Online (Sandbox Code Playgroud)