Skip to content

breadcrumb for embedded documents #146

Open
@raphox

Description

@raphox

I create a class to override the default helper.

Use case:

# Models
class Company
  include Mongoid::Document

  embeds_many :catalogs, { class_name: 'Company::Catalog' }
end

class Company::Catalog
  include Mongoid::Document

  embedded_in :company

  breadcrumb do
    mongoid_breadcrumb_links
  end
end

# ActiveAdmin
ActiveAdmin.register Company do
end

ActiveAdmin.register Company::Catalog, as: 'Catalog' do
  belongs_to :company
end
module ActiveAdmin::ViewHelpers::BreadcrumbHelper
  # Returns an array of links to use in a breadcrumb
  def mongoid_breadcrumb_links(path = request.path)
    # remove leading "/" and split up the URL
    # and remove last since it's used as the page title
    parts = path.split('/').select(&:present?)[0..-2]

    resources = []

    parts.each_with_index.map do |part, index|
      # 1. try using `display_name` if we can locate a DB object
      # 2. try using the model name translation
      # 3. default to calling `titlecase` on the URL fragment
      if part =~ /\A(\d+|[a-f0-9]{24}|(?:[a-f0-9]{8}-(?:[a-f0-9]{4}-){3}[a-f0-9]{12}))\z/ && parts[index - 1]
        parent = active_admin_config.belongs_to_config.try :target
        config = parent && parent.resource_name.route_key == parts[index - 1] ? parent : active_admin_config
        parent_resource = resources.last
##
# main difference from https://github.com/activeadmin/activeadmin/blob/646bf004782e4eae912ff8821f36db691f49fcfb/lib/active_admin/view_helpers/breadcrumb_helper.rb
        resources << if parent_resource
                       collection = parent_resource.send(config.resource_name.collection)
                       collection.find part
                     else
                       config.find_resource part
                     end
##
        name = display_name resources.last
      end

      name ||= I18n.t "activerecord.models.#{part.singularize}",
                      { count: ::ActiveAdmin::Helpers::I18n::PLURAL_MANY_COUNT, default: part.titlecase }

      # Don't create a link if the resource's show action is disabled
      if !config || config.defined_actions.include?(:show)
        link_to name, '/' + parts[0..index].join('/')
      else
        name
      end
    end
  end
end

TIP: Disable company filter in ActiveAdmin.register Company::Catalog because Formtastic doen't work very well with embedded reference.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions