link_if_authorized_unless_currentが欲しい!

自分なりに良い感じのメニューバーが出来上がったが、一つだけ不満なところがある。それは、メニューバーのリンクURLが、現在表示しているページのURLと一致しても、特にその他のメニュー文字列と表示上の差がない。本当はURLが一致するメニュー文字列を、強調表示したいところだ。確認してみると、スタイルシートではちゃんと強調表示するように設定されている。

public/stylesheets/list_o_matic.css
#navlist a:link#current、#navlist a:visited#current、#navlist a:hover#currentの「#current」は、現在のページと同じリンクURLを区別するidとして利用されている。
...(途中省略)...
#navlist a:link#current, #navlist a:visited#current, #navlist a:hover
{
border-bottom: 4px solid #000;
padding-bottom: 0px; /*修正前 2px*/
background: transparent;
color: #000;
}

#navlist a:hover, #navlist a:hover#current
{ 
border-bottom: 4px solid #888; /*追加*/
color: #666;  /*修正前 000*/
}
app/views/layouts/_menu.rhtml
問題は、メニューリンクを生成するHTMLの中で、:id="current"の設定をしていないところだ。
...(途中省略)...
<div id="navcontainer">
<ul id="navlist">
  <%= link_if_authorized 'CSVリスト', {:controller => 'csvs', :action => 'list'}, :wrap_in => "li" %>
  <%= link_if_authorized 'パスワード変更', {:controller => 'user', :action => 'change_password'}, :wrap_in => "li" %>
  <%= link_if_authorized '権限管理', {:controller => 'role', :action => 'list'}, :wrap_in => "li" %>
  <%= link_if_authorized 'ユーザー管理', {:controller => 'user', :action => 'list'}, :wrap_in => "li" %>
  <%= link_if_authorized 'アクセス権管理', {:controller => 'permission', :action => 'list'}, :wrap_in => "li" %>
  <%= link_if_authorized 'ログアウト', {:controller => 'user', :action => 'logout'}, :wrap_in => "li" %>
</ul>
</div>
app/views/layouts/_menu.rhtml
だから、link_if_authorized を実行する前に、以下のように処理すれば良いはず。素直に_menu.rhtmlの中に追記してみた。
      • コントローラー名とアクション名が、リンクURLと一致しているかを調べる。
      • 一致していたら:id="current"をオプション設定する。
<div id="navcontainer">
<ul id="navlist">
  <% current = (controller.controller_name == 'csvs' && controller.action_name == 'list') ? 'current' : '' %>
  <%= link_if_authorized 'CSVリスト', {:controller => 'csvs', :action => 'list'}, :wrap_in => "li", :id => current %>

  <% current = (controller.controller_name == 'user' && controller.action_name == 'change_password') ? 'current' : '' %>
  <%= link_if_authorized 'パスワード変更', {:controller => 'user', :action => 'change_password'}, :wrap_in => "li" %>

...(以下省略、あと4セット同じスタイルのコードが続く)...

これでも、なんとか欲しい機能は実現できるが、コードが長く見難い...。コントローラー名とアクション名の同じ指定を2回しているのも無駄な気がする。条件が変わった時のメンテナンスも大変だ。

Railsにはlink_toの仲間に、link_to_unless_currentというヘルパメソッドがある。これを使うと、リンクURLと現在のページ(これから表示しようとしているページ)が異なる場合だけリンクを生成してくれる。一致する場合は、文字列だけ表示したり、ブロックを渡して、やりたいことを制御することが出来る。とても便利なメソッドだ。

そうなのです、link_if_authorized_unless_currentのようなメソッドが欲しい!