-
-
Save riyad/1933884 to your computer and use it in GitHub Desktop.
+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] || ' > ').html_safe, :class => 'divider') unless current
link_or_text + (last ? '' : (divider || ''))
end
end
end
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
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.
Updated for Bootstrap 4 (alpha6): https://gist.github.com/SaladFork/270a4cb3ac20be9715b7117551c31ec7
Of note:
- No longer has
:separator
option (Bootstrap 4 accomplishes this with CSS) - Now has
:container_tag
option in addition to:tag
option (default to:ol
and:li
, respectively) - Now has
:show_empty
option which defaults tofalse
to prevent rendering when there are no crumbs (h/t @mrfoto's fork)
Bootstrap 5
# The BootstrapBreadcrumbsBuilder is a Bootstrap compatible breadcrumb builder.
# It provides basic functionalities to render a breadcrumb navigation according to Bootstrap's conventions.
#
# You can use it with the :builder option on render_breadcrumbs:
# <%= render_breadcrumbs :builder => ::BootstrapBreadcrumbsBuilder %>
#
# Note: you can put this file into app/utils/bootstrap_breadcrumbs_builder.rb and it will autoload.
#
class BootstrapBreadcrumbsBuilder < BreadcrumbsOnRails::Breadcrumbs::Builder
def render
@context.content_tag(:nav, 'aria-label' => "breadcrumb") do
@context.content_tag(:ol, class: 'breadcrumb') do
@elements.collect do |element|
render_element(element)
end.join.html_safe
end
end
end
def render_element(element)
current = @context.current_page?(compute_path(element))
classes = ['breadcrumb-item']
classes.push('active') if current
@context.content_tag(:li, :class => classes.join(" ") ) do
link_or_text = @context.link_to_unless_current(compute_name(element), compute_path(element), element.options)
link_or_text
end
end
end
Thanks @sadjow!
Works perfectly. Thank you!