新手问题 大家是怎么写 nav link 的 css .active 的?

cqcn1991 · 2015年02月11日 · 最后由 tuoxiaozhong 回复于 2015年03月02日 · 3746 次阅读

导航栏,一般要告诉用户,你现在在哪里 比如 ruby-china,就是li.active

Ruby-China 是用的render_list, 不过这个略复杂,我不是太会用…… https://github.com/xdite/bootstrap-helper/blob/master/lib/bootstrap_helper/helper.rb

我自己有两种 link 需要添加.active, 一种是一般的 path 使用的场景也就和上面一样

# Usage: <%= nav_link  'Trending', pop_path %>
   def nav_link(link_text, link_path, additional_class = nil)
      recognized = Rails.application.routes.recognize_path(link_path)
      if recognized[:controller] == params[:controller]
        if recognized[:controller] != 'static_pages'
          # 对于一般如TopicsController, 在index, new, edit等action下面,都显示active css
          class_name = 'active'
        else
          # 对于StaticPagesController下面杂七杂八的action, 需要全部匹配
          class_name = 'active' if recognized[:action] == params[:action]
        end
      else
        class_name = nil
      end
      class_name = [class_name, additional_class ] if additional_class
      content_tag(:li, :class => class_name) do
        link_to link_text, link_path
      end
    end

另外一种是生成params[:sort]的,应用于页面上本身的一些小的排序,如 tab 等等 使用场景是 以及 Rei 大的 Codecamp,我这个就是按他那个改的

# Usage: <%= selector_link('This is New', tab: 'new') %>
# Generate: link_to link_text, url_for(tab: 'new'), class: ('active' if params[:tab] == 'new')
def selector_link(link_text, link)
  key = link.keys.first
  class_name = 'active'if params[key].to_s == link[key]
  link_to link_text, url_for(link), class: class_name
end

不知道大家是怎么写的?

我现在还是用这种模式:

li class=('active' if condition)

condition 可以是 controller_name == 'foo',也可以是 request.path =~ %r(^/foo),比较灵活。用了 slim 这里已经很简短了,所以不用写 helper。

#1 楼 @Rei 对,我就是看你写的直接是 html....

@Rei 的 campo 代码帮助了不少人啊。

我因为用了 angularjs,直接用 ng-class 绑定方法,方法中得到 url 并判断一个 key 是否在 url 中,返回 true 和 false

#4 楼 @tuoxiaozhong 听起来好爽的感觉,不知道有没有具体的例子?或者网站?Rails+Angular

不过 Angular 最爽的应该是不用管 ajax?不是很了解……

#5 楼 @cqcn1991 我认为最爽的是分离后端代码,实现前端的数据绑定,数据还是通过 ajax 异步操作的。导航的具体例子等我们项目新版上线了给你地址哈

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

      content_tag(:li, class: class_name) do
        link_to link_text, link_path
      end
end

#7 楼 @cqcn1991 额~ 相比 Rei 大大的方法,还是稍微复杂了一点。但是可以提供一个思路,就是前端做这样的判断也是可行的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号