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'クラスを取得するようになります。

これはどうにか可能ですか?そうでない場合、この問題に対する別のアプローチはありますか?コントローラに変数を設定するだけでいいですか?

現在のコントローラーやアクションに基づいた決定の基礎となる記事や質問をすでに見ましたが、これは制限が厳しすぎるため、このアプローチを採用できるかどうかを検討しています。私が思いついたもう1つの解決策は、タブをアクティブ化するための引数を取る1つのビューヘルパーでタブのリスト全体を生成することです。これを各ビューで呼び出します。ただし、レイアウトでリストを生成し、ビューごとにタブをアクティブ化したいと思います。

回避策:これまでのところ、この質問で尋ねたことを実行する方法を知ることなく、妥協案を考え出しました。アプリケーションヘルパーは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 に答える