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


動的ナビゲーションで設定する場合は
optionscontainer_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?}





おしまい