public
Description: Adds a helper method for generating a menubar
Homepage: http://www.pluginaweek.org
Clone URL: git://github.com/pluginaweek/menu_helper.git
obrie (author)
Tue Jun 09 20:33:57 -0700 2009
commit  b2ae301e58a8eb0690ba7b2abf39c6a20f1f22cd
tree    04e65d6db49098413b42b398d78d841a9b6dcf27
parent  5d523ec61612d83899d58a39bdbf880b531935fa
name age message
file .gitignore Fri Jul 04 15:49:38 -0700 2008 Ignore test/app_root/script [obrie]
file CHANGELOG.rdoc Sat Apr 18 19:23:10 -0700 2009 Tag 0.3.0 release [obrie]
file LICENSE Sat Apr 18 17:25:46 -0700 2009 Update license [obrie]
file README.rdoc Sun Apr 12 20:21:16 -0700 2009 Change class css naming conventions to follow t... [obrie]
file Rakefile Tue Jun 09 20:33:57 -0700 2009 Add gemspec [obrie]
file init.rb Thu Mar 22 07:45:09 -0700 2007 Initial revision. [obrie]
directory lib/ Sat Apr 18 19:10:32 -0700 2009 Doc / style fixes [obrie]
file menu_helper.gemspec Tue Jun 09 20:33:57 -0700 2009 Add gemspec [obrie]
directory test/ Sun Apr 12 20:21:16 -0700 2009 Change class css naming conventions to follow t... [obrie]
README.rdoc

menu_helper

menu_helper adds a helper method for generating a menubar.

Resources

API

Bugs

Development

Source

  • git://github.com/pluginaweek/menu_helper.git

Description

The generation of a menubar’s structure can often be a repetitive and unDRY process. A standard using unordered lists is generally followed when creating a menubar. menu_helper attempts to following this standard in addition to automatically adding ids, classes for selected menus, and default urls each menu is linked to (base on various information, such as the name of the menu).

Usage

routes.rb:

  ActionController::Routing::Routes.draw do |map|
    map.with_options(:controller => 'site') do |site|
      site.home '', :action => 'index'
    end

    map.with_options(:controller => 'about_us') do |about_us|
      about_us.about_us 'about_us', :action => 'index'
      about_us.contact 'about_us/contact', :action => 'contact'
      about_us.who_we_are 'about_us/who_we_are', :action => 'who_we_are'
    end

    map.resources :products
    map.resources :services
  end

_menu_bar.html.erb:

  <%=
    menu_bar do |main|
      main.menu :home
      main.menu :products
      main.menu :services
      main.menu :about_us do |about_us|
        about_us.menu :overview, 'Overview', about_us_url
        about_us.menu :who_we_are
        about_us.menu :contact, 'Contact Us'
      end
      main.menu :search, 'Search!', 'http://www.google.com', :class => 'ir'
    end
  %>

Output (formatted for sanity):

  <ul class="ui-menubar ui-menubar-1">
    <li class="ui-menubar-menu ui-menubar-menu-1"><a href="http://example.com/"><span>Home</span></a></li>
    <li class="ui-menubar-menu ui-menubar-menu-1"><a href="http://example.com/products"><span>Products</span></a></li>
    <li class="ui-menubar-menu ui-menubar-menu-1"><a href="http://example.com/services"><span>Services</span></a></li>
    <li class="ui-menubar-menu ui-menubar-menu-1 ui-state-active ui-menubar-selected"><a href="http://example.com/about_us"><span>About Us</span></a>
      <ul class="ui-menubar ui-menubar-2 ui-state-active ui-menubar-selected">
        <li class="ui-menubar-menu ui-menubar-menu-2"><a href="http://example.com/about_us"><span>Overview</span></a></li>
        <li class="ui-menubar-menu ui-menubar-menu-2 ui-state-active ui-menubar-selected"><a href="http://example.com/about_us/who_we_are"><span>Who We Are</span></a></li>
        <li class="ui-menubar-menu ui-menubar-menu-2 ui-menubar-last"><a href="http://example.com/about_us/contact"><span>Contact Us</span></a></li>
      </ul>
    </li>
    <li class="ir ui-menubar-menu ui-menubar-menu-1 ui-menubar-last"><a href="http://www.google.com"><span>Search!</span></a></li>
  </ul>

Caveat Emptor

Remember one of the basic principles of programming: KISS. There’s no need to use this plugin if you’re writing a very, very simple menubar. The advantages of this helper are consistency, DRYness, and decreased complexity if you have lots of submenus.

I wrote this plugin mostly as an educational/experimental piece, so I don’t recommend using this in a production application, but rather a prototype.

Testing

To test this plugin, the following gems must be installed:

To run against a specific version of Rails:

  rake test RAILS_FRAMEWORK_ROOT=/path/to/rails

Dependencies

  • Rails 2.0 or later