Rails3でパンくずリスト
今まで不細工な自前実装をしていたけど、シンプルでお手頃なものがあった。
導入
Gemfileに以下の行を追加してbundle install
gem 'crummy'
基本的な使い方
コントローラーでadd_crumbしてビューでrender_crumbs。
あとは本家のExampleを眺めるとなんとなく分かると思う。
といっただけで終わらずのもなんなので、以下は動作に関するちょっとしたメモ。
パンくずリストの表示 – render_crumbs
ビューのパンくずリストを表示したい場所にrender_crumbsを埋める。
多くの場合はレイアウトファイルに書けばいいと思う。
<%= render_crumbs %>
render_crumbsにはオプションがいくつかあるが、おそらく使いたいのはセパレータの指定くらい。
(デフォルトのセパレータは»)
<%= 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