sinatra-simple-navigationを試す その2
前回の続き。
動的ナビゲーション
前回はconfig/navigation.rbファイルに項目を設定したが、動的に設定することもできる。データベースから読み込むことが多いと思うが、今回は直接コードに記述した。
ハッシュの配列を作る。ハッシュの中身は key, name, url。
app.rb
... configure do set :my_items, [ {:key => :books, :name => 'Books', :url => '/books', :items => [ {:key => :fiction, :name => 'Fiction', :url => '/books/fiction'}, {:key => :history, :name => 'History', :url => '/books/history'}, {:key => :sports, :name => 'Sports', :url => '/books/sports'} ]}, {:key => :music, :name => 'Music', :url => '/music', :items => [ {:key => :rock, :name => 'Rock', :url => '/music/rock'}, {:key => :pop, :name => 'Pop', :url => '/music/pop'}, {:key => :alternative, :name => 'Alternative', :url => '/music/alternative'} ]}, {:key => :dvds, :name => 'Dvds', :url => '/dvds', :items => [ {:key => :drama, :name => 'Drama', :url => '/dvds/drama'}, {:key => :action, :name => 'Action', :url => '/dvds/action'}, {:key => :comedy, :name => 'Comedy', :url => '/dvds/comedy'} ]} ] end ...
viewはrender_navigationのitemsに用意した配列を指定する。
views/index.haml
%h1 sample %hr = render_navigation(:renderer => :breadcrumbs, :join_with => ' » ', :items => settings.my_items) %hr = render_navigation(:expand_all => true, :items => settings.my_items)
あと config/navigation.rb を空ファイルでもいいので用意する。ファイルが存在しないとエラーになってしまった。
DOMのclass/id指定
navigation.rbで設定する場合はdom_id/dom_classで指定する。config/navigation.rb
SimpleNavigation::Configuration.run do |navigation| navigation.items do |primary| primary.dom_id = 'my-id' #追加 primary.dom_class = 'my-class' #追加 primary.item :books, 'Books', '/books' do |books| books.dom_id = 'my-books-id' #追加 books.dom_class = 'my-books-class' #追加 books.item :fiction, 'Fiction', '/books/fiction' books.item :history, 'History', '/books/history' books.item :sports, 'Sports', '/books/sports' end primary.item :music, 'Music', '/music' do |music| music.dom_id = 'my-music-id' #追加 music.dom_class = 'my-music-class' #追加 music.item :rock, 'Rock', '/music/rock' music.item :pop, 'Pop', '/music/pop' music.item :alternative, 'Alternative', '/music/alternative' end primary.item :dvds, 'Dvds', '/dvds' do |dvds| dvds.dom_id = 'my-dvds-id' #追加 dvds.dom_class = 'my-dvds-class' #追加 dvds.item :drama, 'Drama', '/dvds/drama' dvds.item :action, 'Action', '/dvds/action' dvds.item :comedy, 'Comedy', '/dvds/comedy' end end end
動的ナビゲーションで設定する場合は
optionsのcontainer_id/container_classで指定する。
set :my_items, [ {:key => :books, :name => 'Books', :url => '/books', :options => {:container_id => 'my-id', :container_class => 'my_class'}, :items => [ {:key => :fiction, :name => 'Fiction', :url => '/books/fiction'}, {:key => :history, :name => 'History', :url => '/books/history'}, {:key => :sports, :name => 'Sports', :url => '/books/sports'} ]}, ...
navigation.rbの切り替え
render_navigationメソッドでcontextを指定すると指定したcontextに_navigation.rbを付加したファイルで指定したナビゲーションが表示される。
render_navigation(:context => :admin)
とすると config/admin_navigation.rb のナビゲーションが表示される。
条件によって項目を表示/非表示
ifで条件をProcにして渡すと条件がtrueのときのみ項目を表示することができる。primary.item :admin, 'Admin', '/admin', :if => Proc.new {admin_user?}
おしまい