# encoding: utf-8 module Loaf module ControllerExtensions # Module injection # # @api private def self.included(base) base.extend ClassMethods base.send :include, InstanceMethods base.send :helper_method, :_breadcrumbs end module ClassMethods # Add breacrumb to the trail in controller as class method # # @param [String] # # @api public def breadcrumb(name, url, options = {}) normalizer = method(:_normalize_name) before_filter(options) do |instance| normalized_name = normalizer.call(name, instance) normalized_url = normalizer.call(url, instance) instance.send(:breadcrumb, normalized_name, normalized_url, options) end end alias_method :add_breadcrumb, :breadcrumb private # @api private def _normalize_name(name, instance) case name when NilClass when Proc name.call(instance) else name end end end # ClassMethods 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 # Add breadcrumb in controller as instance method # # @param [String] name # # @param [Object] url # # @api public def breadcrumb(name, url, options = {}) _breadcrumbs << Loaf::Crumb.new(name, url, options) end alias_method :add_breadcrumb, :breadcrumb # Collection of breadcrumbs # # @api private def _breadcrumbs @_breadcrumbs ||= [] end # Remove all current breadcrumbs # # @api public def clear_breadcrumbs _breadcrumbs.clear end private def _check_if_nested(collection) collection.last.is_a? Array end end # InstanceMethods end # ControllerExtensions end # Loaf