Rails のパンくずリストのオススメを教えてください

背景

パンくずリストというのを用意してみたところ、センスがなく、これは自前でやるものでなくてライブラリでやったほうがいいと思いました。

要件

つかいやすく、見た目があまりダサくないく、かつ、つくりがあまりダサくない、というものがよいです。

自分が見付けられたもの

ruby-toolbox.com でさらっと見てみたところ、以下の5つがよさそうかな、と思いました。

  • Breadcrumbs On Rails
  • Crummy
  • Breadcrumble
  • Loaf
  • Gretel
Breadcrumbs On Rails

定番のようで、一番人気っぽい。コントローラでリンク名とパスを配列に詰めてゆき、ビューでそれを表示するタイプ

  • ActionController::Base#add_breadcrumb にリンク名とパスを渡しリストを作る。同名のクラスメソッドがあり、before_filter を使いマクロ的に定義する機能を提供する
  • 表示のためのヘルパを定義しており、パンくずリストのセパレータ(» がデフォルト)や、span やら li などのタグ指定ができたりする
  • 幾種類かのリンク名やパスの指定が可能であり、シンボルや Proc オブジェクトをわたせばコントローラのインスタンスのコンテキストで評価される
Crummy

Breadcrumbs On Rails とアプローチは同じで作りもだいたい同じ。マクロ的に before_filter を宣言するクラスメソッドのつくりがちょっと違う。

  • ActionController::Base#add_crumb にリンク名とパスを渡しリストをつくる。ActionController::Base.add_crumb がインスタンスのコンテキストを手にいれるのがすこしへたくそな印象
  • 表示のためのヘルパは、表示用のクラス(Crummy::StandardRenderer というレンダラ)に処理させる方式で、will_paginate っぽい
Breadcrumble

シンプルな Breadcrumbs On Rails。日本の方が作ってる様子。

  • ActionController::Base#add_breadcrumb で(以下略)。マクロ的クラスメソッドがシンプルすぎるかもしれない。collection な URL の named_path の指定はできたい気もする
  • 表示のためのヘルパは、表示用のパーシャルを使う方式で、kaminari っぽい。今はできないが、kaminari みたいに theme オプションを受け付けたりできそう
Loaf

リンクテキスト部分が I18n に対応した Breadcrumbs On Rails という感じ(それ以上の印象がない)。

Gretel

config/initializers 以下に Ruby のファイルを置く設定ファイル方式。

  • config/initializers/breadcrumbs.rb に、パンくずリストのテキストとリンクを名前をつけて設定していく。設定は parent の設定を指定することが可能で、これで階層を表現する。
  • 表示のためのヘルパに、設定ファイルでつけた名前で設定を呼ぶ(<% breadcrumb :issue, @issue %> のように。設定では表示するリンクのリソースを指定することが可能)
  • 標準ではヘルパが content_tag などのメソッドで HTML を生成するが、リストにアクセスするメソッドがあるので、オプション指定でどうにもならないときは ERB などで表示の変更が可能

結論

Gretel が一番よいかなという気がする。パンくずリストの表示という、あまりメインの処理と関係ない(関係ないことはないが)処理のことを考えなくてすむのはありがたい。

なんとなく予想してたけど、Gretel ではわりと view で表示を制御する形になるので(どうあるべきか、は判断しかねる)同じ view をつかいまわすような画面が多いとあつかいづらいかもしれない(helper でラップすればよさそうではある)。また、コントローラでパンくずリストについてあまり意識しなくて済むとはいえ、全く意識しなくていいわけではない。とはいえコントローラの before_filter でなんかいろいろつめてくのもどうなんだろうといつも思うので Gretel でしばらく生きていきます。

Gretel で不都合があれば Breadcrumbs On Rails か Breadcrumble を使う、としたい。
何かオススメがあったら誰かおしえてください。