module Loaf
module Filters
Crumb = Struct.new(:name, :url, :styles)
module ClassMethods
def add_breadcrumb(name, url, options = {})
before_filter(options) do |instance|
instance.send(:add_breadcrumb, _normalize_name(name), url)
end
end
private
def _normalize_name(name=nil)
case name
when NilClass
when Proc
name.call
when Symbol
name.to_s
else
name
end
end
def _process_url(url)
end
end
module InstanceMethods
# Add collection of nested breadcrumbs.
# * collection - required collection of object for iteration
# * field - required object attribute name
#
def add_breadcrumbs(collection, field, options={})
namespace = nil
item_set = if _check_if_nested collection
items = collection.pop
namespace = collection
items
else
collection
end
item_set.each do |item|
add_breadcrumb item.send(field.to_sym), [ namespace, item ].flatten.compact
end
end
def add_breadcrumb(name, url)
_breadcrumbs << Crumb.new(name, url)
end
def _breadcrumbs
@_breadcrumbs ||= []
end
def clear_crumbs
_breadcrumbs.clear
end
private
def _check_if_nested(collection)
collection.last.is_a? Array
end
end # InstanceMethods
def self.included(base)
base.extend ClassMethods
base.send :include, InstanceMethods
base.send :helper_method, :_breadcrumbs
end
end # Filters
end # Loaf