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

时间:2011-12-18 15:33:00

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

以下代码:

<%= link_to "Some Page", some_path %>

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

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

8 个答案:

答案 0 :(得分:89)

在app / helpers / application_helper.rb

def cp(path)
  "current" if current_page?(path)
end

在您的观点中:

<%= link_to "All Posts", posts_path, class: cp(posts_path) %>

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

<%= link_to "All Posts", posts_path, class: "#{cp(posts_path)} additional_class" %>

答案 1 :(得分:18)

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

辅助

def cp(path)
  "current" if request.url.include?(path)
end

视图

<%= link_to "All Posts", posts_path, class: cp(posts_path) %>

现在,如果我的菜单栏是/ users,而我的当前页面是/ users / 10 / post,则链接/用户设置为&#34; current&#34;班级

答案 2 :(得分:10)

我从迈克尔的答案中分出来并调整了帮助者:

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

以下是您使用它的方式:

<%= link_to "Bookings", bookings_path, class: active_class?(bookings_path) %>

如果你有一个可以由多个视图呈现的标签,你可以传递多个路径:

<%= content_tag :li, class: active_class?(bookings_path, action: 'new') %>

最重要的是,如果条件为false,则会插入nil。为什么这样好?好吧,如果您向class提供nil,则根本不会在标记上包含class属性。奖金!

答案 3 :(得分:4)

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

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

使用示例:

<div> <%= link_to_active_class('Dashboard', 'bright_blue', dashboard_path, class: 'link_decor') </div>

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

<div> <a href='/dashboard' class='link_decor bright_blue'>Dashboard</a> </div>

问候。

答案 4 :(得分:3)

我这样做:

<%= link_to "Some Page", some_path, :class => current_page? ? "current" : "" %>

答案 5 :(得分:0)

Eric Boehs解决方案的变体(最强大的一个恕我直言),如果你直接链接到类的对象(即你没有显示索引),添加了一个应用程序助手:

def booking_link
 Booking.find(8)
end

您可以在视图中使用以下内容( dd 用于zurb基础的上下文中)

<%= content_tag :dd, link_to(t('hints.book'), booking_link), class: active_class?(booking_path) %>-

答案 6 :(得分:0)

我认为如果从helper方法生成整个link_to,那将是个好主意。为什么要重复相同的代码(:-) DRY原则)

def create_link(text, path)
  class_name = current_page?(path) ? 'current' : 'any_other_class'

  link_to text, path, class: class_name
end

现在您可以使用:

<%= create_link 'xyz', any_path %>(在视图中)将呈现为<a href="/any" class="current">xyz</a>

希望它有所帮助!

答案 7 :(得分:0)

I tried to combine a couple of the mentioned techniques with my own needs.

def current_page(path)
  'current' if current_page?(path)
end

def create_nav_link(string, path, method)
  link_to string, path, data: { hover: string }, method: method
end

def create_nav_item(string, path, method = nil)
  content_tag :li, create_nav_link(string, path, method), class: current_page(path)
end

Basically it allows you to use it like this: create_nav_item("profile", profile_path) which will result in: <li><a href="/profile" data-hover="Profile">Profile</a></li>,

or <li class="current"><a href="/profile" data-hover="Profile">Profile</a></li> if this is the current page.

I didn't use request.url.include?(path) since it will also always highlight the "Home" button, and I couldn't think of a work around by far.