Created

Embed URL

HTTPS clone URL

SSH clone URL

You can clone with HTTPS or SSH.

Download Gist

How to make breadcrumbs_on_rails render a Bootstrap compatible breadcrumb navigation

View bootstrap_breadcrumbs_builder.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
# The BootstrapBreadcrumbsBuilder is a Bootstrap compatible breadcrumb builder.
# It provides basic functionalities to render a breadcrumb navigation according to Bootstrap's conventions.
#
# BootstrapBreadcrumbsBuilder accepts a limited set of options:
# * separator: what should be displayed as a separator between elements
#
# You can use it with the :builder option on render_breadcrumbs:
# <%= render_breadcrumbs :builder => ::BootstrapBreadcrumbsBuilder, :separator => "&raquo;" %>
#
# Note: You may need to adjust the autoload_paths in your config/application.rb file for rails to load this class:
# config.autoload_paths += Dir["#{config.root}/lib/"]
#
class BootstrapBreadcrumbsBuilder < BreadcrumbsOnRails::Breadcrumbs::Builder
def render
@context.content_tag(:ul, class: 'breadcrumb') do
@elements.collect do |element|
render_element(element)
end.join.html_safe
end
end
 
def render_element(element)
current = @context.current_page?(compute_path(element))
 
@context.content_tag(:li, :class => ('active' if current)) do
link_or_text = @context.link_to_unless_current(compute_name(element), compute_path(element), element.options)
divider = @context.content_tag(:span, (@options[:separator] || '/').html_safe, :class => 'divider') unless current
 
link_or_text + (divider || '')
end
end
end

Works perfectly. Thank you!

+1 thanks!

I think the last link/text should be active ever:

class BootstrapBreadcrumbsBuilder < BreadcrumbsOnRails::Breadcrumbs::Builder
  def render
    @context.content_tag(:ul, :class => 'breadcrumb') do
      elements_count = @elements.size
      i = 0
      @elements.collect do |element|
        i += 1
        render_element(element, last = (i == elements_count))
      end.join.html_safe
    end
  end

  def render_element(element, last = false)
    current = @context.current_page?(compute_path(element))

    @context.content_tag(:li, :class => ('active' if last)) do
      if last
        link_or_text = compute_name(element)
      else
        link_or_text = @context.link_to(compute_name(element), compute_path(element), element.options)
      end
      divider = @context.content_tag(:span, (@options[:separator] || ' &gt; ').html_safe, :class => 'divider') unless current

      link_or_text + (last ? '' : (divider || ''))
    end
  end
end
kinjal commented

save the code as bootstrap_breadcrumbs_builder.rb in application dir/lib. restart server.

Hi, how would you like to license this builder? I'd like to use it in a commercial project. Thanks in advance.

If the separator doesn't work for you, use this class instead:

class BootstrapBreadcrumbsBuilder < BreadcrumbsOnRails::Breadcrumbs::Builder
  def render
    @context.content_tag(:ul, :class => 'breadcrumb') do
      elements_count = @elements.size
      i = 0
      @elements.collect do |element|
        i += 1
        render_element(element, last = (i == elements_count))
      end.join.html_safe
    end
  end

  def render_element(element, last = false)
    current = @context.current_page?(compute_path(element))

    @context.content_tag(:li, :class => ('active' if last)) do
      if last
        link_or_text = compute_name(element)
      else
        link_or_text = @context.link_to(compute_name(element), compute_path(element), element.options)
      end

      divider = @context.content_tag(:span, (@options[:separator] || ' / ').html_safe, :class => 'divider') unless last

      link_or_text + (last ? '' : (divider || ''))
    end
  end
end

this works in development, but not production for me:

ActionView::Template::Error (can't convert Symbol into String):
    11:         = image_tag 'windstream-hosted-solutions-logo.png'
    12:     = render 'navbar'
    13:     .container
    14:       = render_breadcrumbs '/'
    15:     .container
    16:       .row
    17:         .span12
  app/views/layouts/application.html.haml:14:in `_app_views_layouts_application_html_haml___4198396153724011815_32359140'

Bootstrap 3 uses Css to render separators (you don't need to put one manually) so if anyone needs simplified version with working active links you can use my alteration https://gist.github.com/equivalent/9972557

jevin commented

Nice! You can also achieve something similar using CSS only. Like so:

.breadcrumb li:last-child {
  color: #999999
}

That's the default style for the active class in Bootstrap 3.

Also FWIW, I had to do some debugging to figure it out, if you want to check if any breadcrumbs exist, i.e. only render if they do... the breadcrumbs are in the instance variable @breadcrumbs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.