导航栏中的当前选项卡

时间:2012-06-17 23:30:24

标签: ruby-on-rails-3

我有一个导航栏,它是一个无序列表,其中包含制表符作为列表元素。我正在使用视图助手绘制每个单独的选项卡(列表项)。我想根据视图提供的值在每个类上应用active类。这可能吗?

详细说明,在视图帮助器上我可能会有:

def tab_item(tab)
  content_tag :li, :class => ('active' if some_variable == tab) do
    link_to tab, "/#{tab}"
  end
end

在具体的观点中我会这样做:

<% somehow_set_some_variable('dash') %>

这样就可以使视图助手中的some_variable'dash',从而使该标签获得'active'类。

这有可能吗?如果没有,是否有另一种方法来解决这个问题?我应该只在控制器上设置一个变量吗?

我已经看到基于当前控制器和/或操作的决定所依据的文章和问题,但是限制性太强,所以我想看看我是否可以采用这种方法。我想出的另一个解决方案是在一个视图助手中生成完整的选项卡列表,该选项卡接受激活选项卡的参数,并在每个视图中调用它。但是,我宁愿在布局中生成列表,并在每个视图的基础上激活一个选项卡。

解决方法:到目前为止,我已经提出了妥协方案,而不知道如何按照我在这个问题中所做的做法。如果应用程序助手的传入参数与实例变量li匹配,则应用程序助手会创建activate标记并应用@activate

def nav_tab(tab)
  content_tag :li, :id => tab, :class => ('active' if tab == @activate) do
    link_to tab, "/#{tab}"
  end
end

然后在控制器操作中,我只需设置该变量,例如:

def index
  # ...
  @activate = 'dash'
end

这是有效的,它具有我想要的效果:导航栏是独立生成的,然后每个'动作'可以指定要激活的选项卡,如果他们想要。

我不确定这是否是解决此问题的最佳方案。我试图将这些内容保留在视图中,例如this question,以便针对视图特定的<title>更改完成此操作。

1 个答案:

答案 0 :(得分:0)

你可以试试这个只是在应用程序助手中定义一个方法,并通过为每个导航列表传递一个唯一的字符串来调用它

 def active_class(css_class)

    if controller.controller_name == css_class ||  css_class == "#{controller.controller_name}##{controller.action_name}" || css_class == inner_classes
       return "active"
    else
      return ""
    end   
  end


  def inner_classes
    pages = {
      "basic_files#new_part_price_file" => "basic_files#index",
      "basic_files#new_market_basket_file" => "basic_files#index",
      "basic_files#create" => "basic_files#index",
      "basic_files#edit"   => "basic_files#index",
      "basic_files#show"   => "basic_files#index",
      "basic_files#uploads"  => "basic_files#index",
      "basic_files#downloadable_part_price_file" => "basic_files#download_page",
      "basic_files#downloadable_market_basket_file" => "basic_files#download_page",
      "basic_files#download_part_price_file" => "basic_files#download_page",
      "basic_files#download_market_basket_file" => "basic_files#download_page",
    }   
    pages["#{controller.controller_name}##{controller.action_name}"]
  end

在视图中,您可以像这样调用上述方法

<%= link_to 'Home',home_path,:class => "f1 #{active_class('home')}" %>

   <% if current_user.publisher? %>
    <%= link_to 'User',users_path,:class => "f1 #{active_class('users')}" %> 
    <%= link_to 'Upload',basic_files_path,:class => "f1 #{active_class('basic_files#index')}" %>
    <%= link_to 'Publish',publish_completed_basic_files_path,:class => "f1 #{active_class('basic_files#publish_completed')}" %>
    <%= link_to 'Report',audits_path ,:class => "f1 #{active_class('audits')}" %> 

Note it just a example of how you can build automatic navigation highlighting