我的应用程序顶部有一个选项卡列表,我在application.html.erb的一般布局中包含这些选项卡。它们看起来像这样:
<li class="current"><%= link_to "Home", provider_path(current_user.id), :method=> "GET"%> </li>
<li><%= link_to "Edit Profile", edit_student_path(current_user.id) %> </li>
<li><%= link_to "Search", provider_search_path %> </li>
当我点击该页面时,我想将所选标签更改为“当前标签”。因此,当我单击“编辑配置文件”并加载“编辑配置文件”页面时,选项卡应如下所示:
<li><%= link_to "Home", provider_path(current_user.id), :method=> "GET"%> </li>
<li class="current"><%= link_to "Edit Profile", edit_student_path(current_user.id) %> </li>
<li><%= link_to "Search", provider_search_path %> </li>
除了将javascript添加到显示的页面之外,有没有办法做到这一点?或者,如果有尽可能以DRYest方式执行此操作的最佳做法。
由于
答案 0 :(得分:10)
您可以使用controller.class ==
和controller.action_name ==
确切了解您所使用的控制器和操作
所以它会像
<li class="<%= controller.class == ProviderController and controller.action_name == 'show' ? 'current' : '' %>"><%= link_to "Home", provider_path(current_user.id), :method=> "GET"%> </li>
<li class="<%= controller.class == StudentController and controller.action_name == 'edit' ? 'current' : '' %>"><%= link_to "Edit Profile", edit_student_path(current_user.id) %> </li>
<li class="<%= controller.class == ProviderController and controller.action_name == 'search' ? 'current' : '' %>"><%= link_to "Search", provider_search_path %> </li>
我相信有一些方法可以获取您所在页面的当前网址,但是您的“主动”样式将仅依赖于通过该路径获取该操作,这可能并非总是如此,具体取决于路线,这种方式将确保视图根据实际运行的内容显示真实情况,而不是地址栏中的url
答案 1 :(得分:6)
您可以尝试以下方式:
<li class="<%= controller.controller_path == 'provider' ? 'current' : '' %>"><%= link_to "Home", provider_path(current_user.id), :method=> "GET"%> </li>
<li class="<%= controller.controller_path == 'student' ? 'current' : '' %>"><%= link_to "Edit Profile", edit_student_path(current_user.id) %> </li>
<li class="<%= controller.controller_path == 'search' ? 'current' : '' %>"><%= link_to "Search", provider_search_path %> </li>
...然后检查你来自哪个控制器。
答案 2 :(得分:3)
答案 3 :(得分:2)
你可以这样做:
<%= current_page?(:controller => 'your_controller', :action => 'index') ? 'current' : '' %>
答案 4 :(得分:1)
我为此做了一个帮助,它可以接受任何对嵌套资源有用的参数,但它也接受一个控制器名称,就像其他答案一样。
<强>应用helper.rb 强>:
def is_active(*links)
links.each { |link| return "active" if params[:controller] == link }
end
<强> application.html.erb 强>:
<li class="<%=is_active('home')%>">...</li>
或
HAML的示例用法&amp;嵌套资源(对任何提供的控制器名称都是活动的):
<强> applcation.html.haml 强>:
%li{:class => is_active('blogs', 'comments')}
答案 5 :(得分:0)
当您切换页面时,您可以从控制器方法将类似@current_tab的内容传递回erb。然后使用@current_tab来决定哪个li应该是当前类。或者,您可以给每个li和id或一些唯一属性,只需使用您选择的JavaScript框架更改类。
答案 6 :(得分:0)
我所以没有声称这是最好的方法,但是我很勇敢发布我想出的内容:)
布局中的一些示例菜单链接:
<li class="nav-calendar"><%= menu_link_to 'teachers', 'show_date', 'Calendar', calendar_url %></li>
<li class="nav-announcements"><%= menu_link_to 'announcements', nil, 'Announcements', announcements_path %></li>
然后我创建了这个帮手:
def menu_link_to(*args, &block)
controller = args.shift
action = args.shift
if controller == controller_name && (action.nil? || action == action_name)
if args.third.nil?
args.push({:class => 'selected'})
else
args.third.merge!({:class => 'selected'})
end
end
link_to *args, &block
end
答案 7 :(得分:0)
我在应用程序帮助程序中执行了此操作,它似乎工作正常:
def current_page(path)
"active" if current_page?(path)
end
然后这样打电话:
<li class="<%= current_page(root_path)%>"> <%= link_to "Home", root_path %></li>