Twitter-Bootstrapナビゲーションを取得してアクティブなリンクを表示する方法


106

Twitter Bootstrapがナビゲーションのアクティブリンクをどのように実行するのか理解していません。このような通常のナビゲーションがある場合(Ruby on Railsリンクを使用):

<ul class="nav">
  <li class="active"> <a href="/link">Link</a> </li>
  <li class=""> <a href="/link">Link</a> </li>
  <li class=""> <a href="/link">Link</a> </li>        
</ul>

クリックしたリンクに基づいてアクティブにするにはどうすればよいですか?


1
参考までに、私はactive_link_to gemを使用して、{:wrap_class =>:li}を指定します。これにより、<li class = 'active'> ... </ li>が作成されます。REQUEST_URIがHREF値と一致すると...
Justin E

回答:


95

ここ非常に同じ質問に回答しました 。TwitterBootstrap Pills with Rails 3.2.2

<ul class="nav">
  <li class="<%= 'active' if params[:controller] == 'controller1' %>"> <a href="/link">Link</a> </li>
  <li class="<%= 'active' if params[:controller] == 'controller2' %>"> <a href="/link">Link</a> </li>
  <li class="<%= 'active' if params[:controller] == 'controller3' %>"> <a href="/link">Link</a> </li>        
</ul>

21
ここではアイデアは正しいと思いますが、paramsハッシュに直接アクセスするのは悪い考えのようです。同様に、同じコードを何度も繰り返します。少なくともcurrent_pageを使用することをお勧めしますか?現在のコントローラー/アクションをチェックするメソッド、およびコードの繰り返しを回避するためにコードをヘルパーに移動します。
ダスティンFrazier

2
同じことをhamlでどのように書くのでしょうか。hamlに変換してもうまくいきません。または、おそらく私はどこか間違っている
ベンチウォーマー

14
HAMLの実装%li{:class => "#{'active' if current_page?(root_path)}"}=link_to "Home", root_path
ブライアン

dbリクエストを行わずにfriendly_id gemでこれを機能させるエレガントな方法はありますか?
Engin Erdogan 2013年

6
Railsのドキュメントでは、paramsハッシュからアクセスするのではなく、controller_nameおよびaction_nameヘルパーを使用することを推奨しています。
Alexander Suraphel 2013

171

次のようなものを使用できます(@philが述べたものと非常に似ていますが、少し短くなります)。

<ul class="nav">
  <li class="<%= 'active' if current_page?(root_path) %>"><%= link_to "Home", root_path %></li>
  <li class="<%= 'active' if current_page?(about_path) %>"><%= link_to "About", about_path %></li>
  <li class="<%= 'active' if current_page?(contact_path) %>"><%= link_to "Contact", contact_path %></li>
</ul>

10
サブナビゲーションがある場合は機能しません。パスは変わりますが、同じセクションにいます。理にかなっていますか?
Jakob Dam Jensen

3
あなたは関係なく、あなたが同じコントローラ内で実行されているどのような方法で、メニュー項目を強調表示しないようにしたい場合は、はい、正しい、あなたは@Pierreソリューションを使用することができます'active' if params[:controller] == 'controller1'
yorch

はい、これが最もエレガントな方法です。おかげで:)
squiter

2
どのように私はより多くのパスなど特定のパスを追加することができますuser_*_pathでは<%= 'active' if current_page?(root_path) %>
Ismoh 2014

1
メニュー項目をアクティブにするために、複数のパスをどのように追加しますか?たとえば、同じメニュー項目のコンポーネントであるドロップダウンにいくつかの項目があり、ドロップダウンメニューにあるページのいずれかにいるときにメニュー項目をアクティブにしたい場合は、できるだけ早くお知らせください。
msc 2014


33

ヘルパーを使用して、これをRailsのフォームヘルパーのスタイルで実装しました。

ヘルパー(例app/helpers/ApplicationHelper.rb):

def nav_bar
  content_tag(:ul, class: "nav navbar-nav") do
    yield
  end
end

def nav_link(text, path)
  options = current_page?(path) ? { class: "active" } : {}
  content_tag(:li, options) do
    link_to text, path
  end
end

次に、ビューで(例:) app/views/layouts/application.html.erb

<%= nav_bar do %>
  <%= nav_link 'Home', root_path %>
  <%= nav_link 'Posts', posts_path %>
  <%= nav_link 'Users', users_path %>
<% end %>

この例では、(「ユーザー」ページの場合)次のように生成されます。

<ul class="nav navbar-nav">
  <li><a href="/">Home</a></li>
  <li><a href="/posts">Posts</a></li>
  <li class="active"><a href="/users">Users</a></li>
</ul>

これは素晴らしい!ありがとう!
Krzysztof Witczak

私はこのアイデアが好きですが、html = {}と呼ばれるnav_link関数に3番目の引数を追加し、それをlink_toに渡します。これにより、link_toを通常使用するのと同じ方法で、htmlハッシュをnav_linkに渡すことができます。
Ryan Friedman、

22

代わりにこれを使用して、サーバーコードなしの現在のルートに基づいてナビゲーションのアクティブリンクを選択します。

    $(document).ready(function () {
        $('a[href="' + this.location.pathname + '"]').parent().addClass('active');
    });

2
これは、ドロップダウンメニューでも機能するため、最良のソリューション$('li.active').closest('.dropdown').addClass('active');です。親メニューを強調表示する行も含めます。
Seralto

サブページにも適用するように変更するにはどうすればよいですか?以下のようなexample.com/homeが動作します。example.com/home/pageの場合にもアクティブにするには「ホーム」リンクが必要です。
athultuttu

11

hamlで論理and&&)を使用して成功しました:

%ul.nav
  %li{class: current_page?(events_path) && 'active'}
    = link_to "Events", events_path
  %li{class: current_page?(about_path) && 'active'}
    = link_to "About Us", about_path

5

各リンクについて:

<% if current_page?(home_path) -%><li class="active"><% else -%><li><% end -%>
  <%= link_to 'Home', home_path %>
</li>

あるいは

<li <% if current_page?(home_path) -%>class="active"<% end -%>>
  <%= link_to 'Home', home_path %>
</li>

3

twitterブートストラップcssがどのように使用されているのか、またはRails側に質問しているかどうかはわかりません。レール側を想定しています。

その場合は、チェックアウト#link_to_ifの方法や#link_to_unless_current方法を


3

今日、私は同じ質問/問題を抱えていましたが、解決のための他のアプローチがありました。application_helper.rbにヘルパー関数を作成します。

def navMainAktiv(actionName)
    if params[:action] == actionName    
    "active"
    end
end

リンクは次のようになります。

<li class="<%= navMainAktiv('about')%>"><%= link_to "About", about_path %></li>

に置き換えparams[:action]params[:controller]、リンクにコントローラー名を設定できます。


2

私はそれぞれにこれを使用しますli

<li><%= link_to_unless_current('Home', root_path) { link_to('Home', root_path, class: 'active') } %></li>


クラスは設定しliないでくださいa
Christopher Oezbek

2

あなたはヘルパーメソッドを application_helper.rb

def create_link(text, path)
  class_name = current_page?(path) ? 'active' : ''

  content_tag(:li, class: class_name) do
    link_to text, path
  end
end

これで次のように使用できます:

create_link 'xyz', any_path これは次のようにレンダリングされます

<li class="active">
  <a href="/any">xyz</a>
</li>

それが役に立てば幸い!


1

CSSクラスを操作して自分で行う必要があります。つまり、ユーザーがリンクをクリックして何かを行った場合(ターゲットアクション)、前のリンクを非アクティブにし、新しいリンクをアクティブにします。

リンクがサーバーにアクセスする(つまり、ページをリロードする)場合は、サーバー上でアクティブリンクを正しくレンダリングできます。それ以外の場合、クライアント側のもの(タブペインの切り替えなど)を実行している場合は、JavaScriptを使用する必要があります。



1

ハッシュでcurrent_page?カスタムclass名を指定できる場合は、ビューヘルパーのビルドを使用して簡単なヘルパーメソッドを作成しましたhtml_options

def active_link_to(name = nil, options = nil, html_options = nil, &block)
  active_class = html_options[:active] || "active"
  html_options.delete(:active)
  html_options[:class] = "#{html_options[:class]} #{active_class}" if current_page?(options)
  link_to(name, options, html_options, &block)
end

例(root_pathルート上にある場合):

<%= active_link_to "Main", root_path %>
# <a href="/" class="active">Main</a>

<%= active_link_to "Main", root_path, class: "bordered" %>
# <a href="/" class="bordered active">Main</a>

<%= active_link_to "Main", root_path, class: "bordered", active: "disabled" %>
# <a href="/" class="bordered disabled">Main</a>

1

ここでの答えの多くは、うまくいくもの、または部分的な答えを持っています。たくさんのことを組み合わせて、このRailsヘルパーメソッドを使用しました。

# helper to make bootstrap3 nav-pill <li>'s with links in them, that have
# proper 'active' class if active. 
#
# the current pill will have 'active' tag on the <li>
#
# html_options param will apply to <li>, not <a>. 
#
# can pass block which will be given to `link_to` as normal. 
def bootstrap_pill_link_to(label, link_params, html_options = {})
  current = current_page?(link_params)

  if current
    html_options[:class] ||= ""
    html_options[:class] << " active "
  end

  content_tag(:li, html_options) do
    link_to(label, link_params)
  end      
end

&blocklink_toなどをサポートするための引数チェックでさらに洗練されたものにすることができます。


1

すでに多くの回答がありますが、ここに、Bootstrap Iconsをアクティブリンクで動作させるために書いたものがあります。それが誰かを助けることを願って

このヘルパーはあなたに与えるでしょう:

  1. カスタムテキストを含むリンクを持つli要素
  2. オプションのBootstrap3アイコン
  3. 右のページでアクティブになります

これをapplication_helper.rbに入れてください

def nav_link(link_text, link_path, icon='')
  class_name = current_page?(link_path) ? 'active' : ''
  icon_class = "glyphicon glyphicon-" + icon

  content_tag(:li, :class => class_name) do
    (class_name == '') ? (link_to content_tag(:span, " "+link_text, class: icon_class), link_path)
    : (link_to content_tag(:span, " "+link_text, class: icon_class), '#')
  end
end

そしてリンクを使用してください:

<%= nav_link 'Home', root_path, 'home'  %>

最後の引数はオプションです-リンクにアイコンを追加します。グリフアイコンの名前を使用します。テキストのないアイコンが必要な場合:

    <%= nav_link '', root_path, 'home'  %>

1

これが私がしたことです:

ViewsHelperを作成し、ApplicationControllerに含めました。

include ViewsHelper

ViewsHelperの内部で、次のような簡単なメソッドを作成しました。

def page_state(path)
  current_page?(path) ? 'active' : ''
end

私の見解では、これを行います:

<li class="<%= page_state(foobar_path) %>"><%= link_to 'Foobars', foobar_path %></li>

0

ナビゲーションシステムを実装する必要があるように聞こえます。複雑な場合、かなり醜く、かなり速くなる可能性があります。

この場合、それを処理できるプラグインを使用することをお勧めします。navigasmicまたはシンプルなナビゲーションを使用できます(navigasmicを使用することをお勧めします。メインレイヤーはビューに属し、一部の構成ではありません)。


0

最短コード 

これは、両方のナビゲーションとサブナビゲーションリストの要素を扱います。いずれかの配列に単一のパスを渡すことができ、両方を処理します。

application_helper

# Active page method
def ap(p:);'active' if p.class == Array ? p.map{|m| current_page? m}.any? : (current_page? p) end

ビュー(html.erb)

<ul class="nav navbar-nav">
  <li class="<%= ap p: home_path %>">Home</li>
  <li class="<%= ap p: account_path %>">Account</li>

  <li class="dropdown <%= ap p: [users_path, new_user_path] %>">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Users</a>
    <ul class="dropdown-menu" role="menu">
      <li class="<%= ap p: users_path %>">Users</li>
      <li class="<%= ap p: new_user_path %>">Add user</li>
    </ul>
  </li>
</ul>

0

シナトラでルビーを使う..

ブートストラップのベアテーマを使用しています。これはサンプルのnavbarコードです。要素のクラス名-> .navに注意してください-これはjavaスクリプトで参照されます。

/ Collect the nav links, forms, and other content for toggling
    #bs-example-navbar-collapse-1.collapse.navbar-collapse
      %ul.nav.navbar-nav
        %li
          %a{:href => "/demo/one"} Page One
        %li
          %a{:href => "/demo/two"} Page Two
        %li
          %a{:href => "/demo/three"} Page Three

ビューページ(または部分的)にthis:javascriptを追加します。これは、ページが読み込まれるたびに実行する必要があります。

hamlビュースニペット->

- content_for :javascript do
  :javascript
      $(function () {
          $.each($('.nav').find('li'), function() {
              $(this).toggleClass('active',
                  $(this).find('a').attr('href') == window.location.pathname);
          });
      });

JavaScriptデバッガーで、 'href'属性の値がwindow.location.pathnameと一致することを確認してください。これは、問題の修正に役立つ@Zitraxによるソリューションとは少し異なります。


0

基本、ヘルパーなし

<%= content_tag(:li, class: ('active' if request.path == '/contact')) do %>
    <%= link_to 'Contact', '/contact' %>
<% end %>

複数のクラスがあるので、これを使用します-

<%= content_tag(:li, class: (request.path == '/contact' ? 'active black' : 'black')) do %>
    <%= link_to 'Contact', '/contact' %>
<% end %>

1
これはどのサブナビゲーションでも機能します。サブリンクで親リクエストパスを使用するだけです。
scottkekoa

0
  def active_navigation?(controllers_name, actions_name)
   'active' if controllers_name.include?(controller_name) && actions_name.include?(action_name)
  end

スリム

li class=(active_navigation?(['events'], ['index', 'show'])) = link_to t('navbar.events'), events_path
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.