更改Rails中的当前选项卡

时间:2009-11-17 21:17:45

标签: ruby-on-rails css dom

我的应用程序顶部有一个选项卡列表,我在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方式执行此操作的最佳做​​法。

由于

8 个答案:

答案 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)

查看TabsOnRails

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