Railsでアクティブなページに対応するタブのスタイル変える場合

タブナビゲーションで現在いるページに対応するタブのみcssを適用したい場合、application_helper.rbか、viewに直書きするかのどっちかで実装されてることが多いよう

例えばトップページにいる場合

<!-- # application.html.erb -->
<ul class="nav">
     <li class="item active">TOP</li>
     <li class="item">PROFILE</li>
     <li class="item">LINKS</li>
</ul>

こんな感じで.activeを付け加えたい。

application_helper.rbに書く場合

# application_helper.rb
def active?(controller_name)
     return "active" if controller_name == params[:controller]
end
<!-- # application.html.erb -->
<ul class="nav">
     <li class="item <%= active?("articles") %>">ARTICLE</li>
     <li class="item <%= active?("profile") %>">PROFILE</li>
     <li class="item <%= active?("links") %>">LINKS</li>
</ul>


viewに直書きする場合

<!-- # application.html.erb -->
<ul class="nav">
     <li class="item <%= "active" if params[:controller] == "articles" %>">ARTICLE</li>
     <li class="item <%= "active" if params[:controller] == "profile" %>">PROFILE</li>
     <li class="item <%= "active" if params[:controller] == "links" %>">LINKS</li>
</ul>


application_helper.rbに書く方がいいのかな?

またarticleに添付されたファイルを扱うarticle_attachmentsコントローラのアクションの場合でもARTICLEタブに.activeをふりたいような場合、viewに直書きすると見づらくなってよろしゅうないということで、active?メソッドを

# application_helper.rb
def active?(*controllers_name)
     return "active" if controllers_name.include?(params[:controller])
end

として任意の数のcontroller名を受け取れるようにして、params[:controller]が含まれているかいないかで判定するようにすると、

<!-- # application.html.erb -->
<ul class="nav">
     <li class="item <%= active?("articles","article_attachments") %>">ARTICLE</li>
     <li class="item <%= active?("profile") %>">PROFILE</li>
     <li class="item <%= active?("links") %>">LINKS</li>
</ul>

割と見やすい気がする。
「ルーティングの特定のネームスペース以下のものだけこういう処理」みたいなのができるようであれば、それが一番簡単にかける気もする…

しばらくRailsとはお別れして、androidやる日が続きそう。
「Land of Lisp」とか「Rubyによるデザインパターン」とか「入門 機械学習」買ったのに積んでるからそれも読まんと…