以下代码:
<%= link_to "Some Page", some_path %>
如何使用current
辅助方法应用css类current_page?
?
或者,如果有其他更好的方法可用吗?
答案 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.