1

我有一个导航栏,它是一个以标签作为列表元素的无序列表。我正在使用视图助手绘制每个单独的选项卡(列表项)。我想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

这有效,并且具有我正在寻找的效果:导航栏是独立生成的,然后每个“操作”都可以指定要激活的选项卡,如果他们愿意的话。

我不确定这是否是解决此问题的最佳方法。我试图将这些东西保留在视图中,例如这个问题<title>,它可以针对特定于视图的更改完成此操作。

4

1 回答 1

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

于 2012-06-18T03:03:04.140 回答