在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,我想不出远处的工作。