0.0
No commit activity in last 3 years
No release in over 3 years
Helper to generate stateful navigation links.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

>= 3
 Project Readme

StatefulLink¶ ↑

StatefulLink is a helper that simplifies displaying stateful navigation links.

Installation¶ ↑

Rails 3 only. Add the following line to your Gemfile:

gem 'stateful_link'

Problem¶ ↑

Let we have RESTful PostsController and two navigation links in layout.

layouts/application.html.erb
  <ul>
    <li>
      <%= link_to "Posts", posts_url %>
      <ul>
        <li><%= link_to "New post", new_post_url %></li>
      </ul>
    </li>
  </ul>

So, at every page we have same links. But in good form we should mark current user location by changing visual appearance of current and parent navigation links. For example, if user opens new post page, “New post” should be displayed as regular text, and “Posts” should become bold.

Solution¶ ↑

posts_controller.rb

  class PostsController < ApplicationController
    ...
  end

application_helper.rb

  module ApplicationHelper
    def navigation_link(label, active, chosen, url)
      stateful_link_to(
        :active => proc { label },
        :chosen => proc { content_tag :b, link_to(label, url) },
        :inactive => proc { link_to label, url },
        :state => proc {
          if action_any_of?(active) # See below
            :active
          elsif action_any_of?(chosen)
            :chosen
          else
            :inactive
          end
        }
      )
    end
  end

layouts/application.html.erb

  <ul>
    <li>
      <%= navigation_link("Posts", "posts#index", "posts#*", posts_url) %>
      <ul>
        <%= navigation_link("New post", ["posts#new", "posts#create"], nil, new_post_url) %>
      </ul>
    </li>
  </ul>

Examples¶ ↑

posts/index.html.erb

<%= "we are in PostsController::index" if action_any_of?("posts#index") %>
<%= "we are in PostsController::index" if action_any_of?("#index") %>
<%= "action state is active" if action_state("#index") == :active %>
<%= "action state is chosen" if action_state("#show", ["#index", "#edit", "#update"]) == :chosen %>
<%= "action state is inactive" if action_state("users#index") == :inactive %>