在Rails 3中突出显示当前页面的最佳方法是什么? – 有条件地应用CSS类来链接

对于下面的代码:

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

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

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

在app / helpers / application_helper.rb中

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

在你的看法:

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

基本上写一个简单的包装在它周围。 另外,您可以扩展该方法以允许通过添加参数来应用其他类。 保持意见简洁/干燥。 或者,在不扩展该方法的情况下,您可以像这样简单地进行string插值来添加其他类:

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

在我的情况下,我有很多命名空间控制器,这就是为什么我喜欢显示当前视图是否也在菜单path中,我已经使用了迈克尔范Rooijen解决scheme,然后我定制我的情况。

帮手

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

视图

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

现在,如果我的菜单栏是/ users,并且我的当前页面是/ users / 10 / post,则链接/用户将被设置为“当前”类

我从迈克尔的回答中分手,调整了帮手:

 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) %> 

你可以传递多个path给它,以防万一你有一个可以被多个视图渲染的选项卡:

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

关于这一点的好处是,如果条件是false ,它将插入nil 。 为什么这很好? 那么,如果您提供的class nil ,它将不会在标签中包含类属性。 奖金!

为了不必重复你自己的太多,必须检查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 

用法示例:

 <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> 

问候。

我会这样做:

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

Eric Boehs解决scheme(最健壮的一个)的变种,如果你直接链接到类的对象(即你不显示索引),添加一个应用程序助手:

 def booking_link Booking.find(8) end 

您可以在视图中使用以下内容(在zurb基础中使用dd

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

我想如果从辅助方法中生成完整的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>

希望能帮助到你!

我试图结合我提到的几个技巧与我自己的需要。

 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 

基本上它可以让你像这样使用它: create_nav_item("profile", profile_path)将会导致: <li><a href="/profile" data-hover="Profile">Profile</a></li>

<li class="current"><a href="/profile" data-hover="Profile">Profile</a></li>如果这是当前页面。

我没有使用request.url.include?(path)因为它总是会突出显示“主页”button,我想不出远处的工作。