在Rails 3中突出显示当前页面的最佳方法? - 有条件地将css类应用于链接

Jac*_*cob 47 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

对于以下代码:

<%= link_to "Some Page", some_path %>
Run Code Online (Sandbox Code Playgroud)

如何current使用current_page??辅助方法应用css类?

或者,如果有其他更好的方法可用?

Mic*_*jen 90

在app/helpers/application_helper.rb中

def cp(path)
  "current" if current_page?(path)
end
Run Code Online (Sandbox Code Playgroud)

在您的观点中:

<%= link_to "All Posts", posts_path, class: cp(posts_path) %>
Run Code Online (Sandbox Code Playgroud)

基本上写一个简单的包装器.此外,您可以扩展该方法以允许通过添加参数来应用其他类.保持简洁/干燥的观点.或者,在不扩展方法的情况下,您可以像这样添加其他类来执行简单的字符串插值:

<%= link_to "All Posts", posts_path, class: "#{cp(posts_path)} additional_class" %>
Run Code Online (Sandbox Code Playgroud)


rde*_*an1 18

在我的情况下,我有很多名称间隔控制器,这就是为什么我喜欢显示当前视图是否也在菜单路径中,我使用了Michael van Rooijen的解决方案然后我自定义我的情况.

帮手

def cp(path)
  "current" if request.url.include?(path)
end
Run Code Online (Sandbox Code Playgroud)

视图

<%= link_to "All Posts", posts_path, class: cp(posts_path) %>
Run Code Online (Sandbox Code Playgroud)

现在,如果我的菜单栏是/ users,我的当前页面是/ users/10/post,那么链接/用户设置为"当前"类

  • 我很高兴找到了这个.这对我需要的东西来说非常完美! (2认同)

Eri*_*ehs 10

我对迈克尔的答案进行了分支并调整了帮助:

def active_class?(*paths)
  active = false
  paths.each { |path| active ||= current_page?(path) }
  active ? 'active' : nil
end
Run Code Online (Sandbox Code Playgroud)

这是你如何使用它:

<%= link_to "Bookings", bookings_path, class: active_class?(bookings_path) %>
Run Code Online (Sandbox Code Playgroud)

如果您有一个可以由多个视图呈现的选项卡,您可以传递多个路径:

<%= content_tag :li, class: active_class?(bookings_path, action: 'new') %>
Run Code Online (Sandbox Code Playgroud)

关于这一点的好处是false,如果条件是,它将插入nil.为什么这样好?好吧,如果你提供classnil它不包括标签上的类属性的.奖金!


Nik*_* So 5

为了不必通过一直检查link_to方法内部的 current_page 来重复你自己太多,这里有一个你可以使用的自定义助手(把它放在 app/views/helpers/application_helpers.rb

def link_to_active_class(name, active_class_names, options = {}, html_options = {}, &block)
  html_options[:class] = html_options[:class].to_s + active_class_names if current_page?(options.to_s)
  link_to name, options, html_options, &block
end
Run Code Online (Sandbox Code Playgroud)

用法示例:

<div> <%= link_to_active_class('Dashboard', 'bright_blue', dashboard_path, class: 'link_decor') </div>
Run Code Online (Sandbox Code Playgroud)

如果你在http://example.com/dashboard,那么它应该返回:

<div> <a href='/dashboard' class='link_decor bright_blue'>Dashboard</a> </div>
Run Code Online (Sandbox Code Playgroud)

问候。