Skip to content

Instantly share code, notes, and snippets.

@sunny
Created July 25, 2012 17:21
Show Gist options
  • Save sunny/3177367 to your computer and use it in GitHub Desktop.
Save sunny/3177367 to your computer and use it in GitHub Desktop.
li_nav : Utilitaire pour faire des liens dans des <li> qui appliquent des classe "current" automatiquement
# encoding: UTF-8
module ApplicationHelper
# Utilitaire pour faire un lien dans un li qui applique des classe "current"
# automatiquement.
#
# Arguments :
# - nom : nom du lien
# - url : chemin vers la page
# - options : options html à passer au li
# - block : html supplémentaire à insérer après le lien
#
# Se sert également de la variable `@nav_parents`.
#
# Exemple:
# <ul>
# <%= li_nav "Accueil", root_url, :id => "accueil" %>
# <%= li_nav "Catégories", categories_url do %>
# <ul>
# <%= li_nav "Enfants", enfants_url %>
# </ul>
# <% end %>
# </ul>
#
# Dans cet exemple si on se trouve sur la page "Enfants", on aura l'html suivant :
# <ul>
# <li><a href="/" id="accueil">Accueil</a></li>
# <li class="has-current"><a href="/categories">Catégories</a>
# <ul>
# <li class="current"><a href="/enfants">Enfants</a></li>
# </ul>
# </li>
# </ul>
def li_nav(nom, url, options = {}, &block)
url = url_for(url)
# Récupère le contenu du block donné
content = block ? capture(&block) : ""
# Ajoute classes au <li> :
# - "current" si la page est la page actuelle.
# - "has-current" si dans le bloc donné on trouve class="current"
# - "has-current" si @nav_parents contient la page actuelle
classes = Array(options[:class])
classes << "current" if request.path == url
classes << "has-current" if content =~ / class=".*current"/ or \
Array(@nav_parents).include?(url)
classes = classes.flatten.compact.join(' ').strip
options[:class] = classes unless classes.empty?
# Retourne html
content_tag(:li, options) do
link_to(nom, url) + content
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment