Question

I have a helper method to help to determine whether or not a navigation menu item should be active/inactive.

  def events_nav_link
    nav_item = 'Events'

    if current_page?(events_path) # additional conditions here
      # do nothing
    else
      nav_item = link_to nav_item, events_path
    end

    content_tag(:li, nav_item + vertical_divider, :class => 'first')
  end

I want this link to be inactive not only for the events_path page, but for other pages as well. Problem is that I don't know what param to pass the current_page?(path) method based on this route:

map.list_events '/events/:league/:year/:month/:day', :controller => 'events', :action => 'list'

This route generates a path such as /pow or /chow/2011/09/25. Leagues can be pow, chow or wow.

Was it helpful?

Solution

I like unobtrusive JS approach with add/remove classes and unwrap() deactivated links, but it requries specific rules.

The Rails way is to use link_to_unless_current built-in helper to highlight and unlink on current page href.

OTHER TIPS

You're looking for named routes. In your routes.rb file, add

:as => :foo

after the route. Then use

if current_page(events_path) || current_page(foo_path)

in your condition.

This is what I do:

application_helper.rb:

  def already_here?(this_controller,this_action)
    controller_name == this_controller && action_name == this_action ? true : false
  end

in a view:

<%= already_here?("users","index") ? "Manage Users" : link_to("Manage Users", users_path, :title => "Manage Users.") %>

Of course, you can abstract it further by passing the title of the link and path to the helper if you want, but that's a bit of a hassle (to me).

UPDATE: never mind, see mikhailov's answer- much cleaner (why reinvent the wheel?) :)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top