Rails3でパンくずリスト

今まで不細工な自前実装をしていたけど、シンプルでお手頃なものがあった。

zachinglis/crummy – GitHub

導入

Gemfileに以下の行を追加してbundle install

gem 'crummy'

基本的な使い方

コントローラーでadd_crumbしてビューでrender_crumbs。
あとは本家のExampleを眺めるとなんとなく分かると思う。

といっただけで終わらずのもなんなので、以下は動作に関するちょっとしたメモ。

パンくずリストの表示 – render_crumbs

ビューのパンくずリストを表示したい場所にrender_crumbsを埋める。
多くの場合はレイアウトファイルに書けばいいと思う。

<%= render_crumbs %>

render_crumbsにはオプションがいくつかあるが、おそらく使いたいのはセパレータの指定くらい。
(デフォルトのセパレータは&raquo;)

<%= render_crumbs :separator => ' | ' %>

生成されるHTMLはdivやulなどで囲まれていないフラットな物になるので、凝ったスタイルを当てたければやり方がやや微妙ではあるが以下のように構造化する。

<ul>
<li><%= render_crumbs :separator => '</li><span>|</span><li>' %></li>
</ul>

パンくずリストの要素の追加 – add_crumb

コントローラー内でadd_crumbするとパンくずリストに要素が追加される。

class ApplicationController < ActionController::Base
  add_crumb 'HOME', '/'
end

一番目の引数が表示する文字列。
二番目の引数がリンク先となる。省略するとリンクなしのパンくず要素となる。

before_filterと同じように:exceptや:onlyで適用するアクションを限定できる。
例えば以下のようにすればトップページにいるときはパンくずの最初の要素をリンクなしにできる。

class ApplicationController < ActionController::Base
  add_crumb 'HOME', '/', :except => 'home'
  add_crumb 'HOME', :only => 'home'
end

add_crumbされた順番にパンくずが表示されるので、ApplicationControllerでadd_crumbしたものは常にパンくずの最初の要素となる。

あるコントローラー内でadd_crumbした場合は、基本的にそのコントローラー内のすべてのアクションで表示される。(前述のように:exceptと:onlyで制御することは可能)

特定のアクション内でのみ表示したいパンくずは、そのアクション内でadd_crumbすることもできる。

class PrefectureController < ApplicationController
  add_crumb 'Prefecture', prefecture_list_path

  def list
    @prefectures = Prefecture.order(:id)
  end

  def detail
    @prefecture = Prefecture.find_by_id(params[:id])

    add_crumb @prefecture.name
  end
end

Tips

デバッグ

思うようにパンくずが表示されない場合は、@_crumbsにパンくずの内容が入っているのでテンプレート内で出力して内容を確かめる。

<%= @_crumbs %>
titleタグの生成に利用する

パンくずの構成をtitleタグに流用することでページのタイトルもいいかんじにできる。
例えば以下のようなヘルパーメソッドを作成するなど。

  def render_title_tag_text
    sections = @_crumbs.map{|c| c.first }.reject{|c| c == 'HOME'}
    sections.unshift('ひげろぐ') # サイト名を付け加える
    sections.reverse.join(' - ')
  end

前の記事

CentOSでgitosis