All Projects → piotrmurach → Loaf

piotrmurach / Loaf

Licence: mit
Manages and displays breadcrumb trails in Rails app - lean & mean.

Programming Languages

ruby
36898 projects - #4 most used programming language

Projects that are alternatives of or similar to Loaf

Devise masquerade
Extension for devise, enable login as functionality. Add link to the masquerade_path(resource) and use it.
Stars: ✭ 380 (+5.56%)
Mutual labels:  rails, ruby-on-rails, ruby-gem
Matestack Ui Core
Matestack enables you to create sophisticated, reactive UIs in pure Ruby, without touching JavaScript and HTML. You end up writing 50% less code while increasing productivity, maintainability and developer happiness.
Stars: ✭ 469 (+30.28%)
Mutual labels:  rails, ruby-on-rails, ruby-gem
Motion
Reactive frontend UI components for Rails in pure Ruby
Stars: ✭ 498 (+38.33%)
Mutual labels:  rails, ruby-on-rails, ruby-gem
arask
Automatic RAils taSKs.
Stars: ✭ 31 (-91.39%)
Mutual labels:  ruby-gem, ruby-on-rails
rails cursor pagination
Add cursor pagination to your ActiveRecord backed application
Stars: ✭ 21 (-94.17%)
Mutual labels:  ruby-gem, ruby-on-rails
filtered
Filters ActiveRecord queries in a nice way
Stars: ✭ 28 (-92.22%)
Mutual labels:  ruby-gem, ruby-on-rails
tag columns
Fast & simple Rails ActiveRecord model tagging using PostgreSQL's Array datatype
Stars: ✭ 40 (-88.89%)
Mutual labels:  ruby-gem, ruby-on-rails
Email inquire
Validate email for common typos and one-time email providers
Stars: ✭ 257 (-28.61%)
Mutual labels:  rails, ruby-gem
katapult
Kickstart Rails development!
Stars: ✭ 21 (-94.17%)
Mutual labels:  ruby-gem, ruby-on-rails
Tomo
A friendly CLI for deploying Rails apps ✨
Stars: ✭ 260 (-27.78%)
Mutual labels:  rails, ruby-gem
Rails performance
Monitor performance of you Rails applications
Stars: ✭ 345 (-4.17%)
Mutual labels:  rails, ruby-on-rails
mobility-actiontext
Translate Rails Action Text rich text with Mobility.
Stars: ✭ 27 (-92.5%)
Mutual labels:  ruby-gem, ruby-on-rails
has placeholder image
A Ruby gem for generating string based placeholder images in Rails.
Stars: ✭ 20 (-94.44%)
Mutual labels:  ruby-gem, ruby-on-rails
slack widgets
An abstraction of the JSON structure needed to create widgets in Slack message attachments
Stars: ✭ 14 (-96.11%)
Mutual labels:  ruby-gem, ruby-on-rails
eight ball
Ruby gem for querying feature flags
Stars: ✭ 17 (-95.28%)
Mutual labels:  ruby-gem, ruby-on-rails
delayed-web
A rails engine that provides a simple web interface for exposing the Delayed::Job queue.
Stars: ✭ 71 (-80.28%)
Mutual labels:  ruby-gem, ruby-on-rails
Pluck to hash
Extend ActiveRecord pluck to return array of hashes
Stars: ✭ 275 (-23.61%)
Mutual labels:  rails, ruby-gem
Kickoff tailwind
A rapid Rails 6 application template for personal use bundled with Tailwind CSS
Stars: ✭ 287 (-20.28%)
Mutual labels:  rails, ruby-on-rails
Ansible Rails
Ansible: Ruby on Rails Server
Stars: ✭ 317 (-11.94%)
Mutual labels:  rails, ruby-on-rails
activerecord-setops
Union, Intersect, and Difference set operations for ActiveRecord (also, SQL's UnionAll).
Stars: ✭ 21 (-94.17%)
Mutual labels:  ruby-gem, ruby-on-rails
Loaf gem logo

Loaf

Gem Version Actions CI Maintainability Coverage Status Inline docs

Loaf manages and displays breadcrumb trails in your Rails application.

Features

  • Use controllers and/or views to specify breadcrumb trails
  • Specify urls using Rails conventions
  • No markup assumptions for breadcrumbs trails rendering
  • Use locales file for breadcrumb names
  • Tested with Rails >= 3.2 and Ruby >= 2.0.0

Installation

Add this line to your application's Gemfile:

gem "loaf"

And then execute:

$ bundle

Or install it yourself as:

gem install loaf

Then run the generator:

rails generate loaf:install

Contents

1. Usage

Loaf allows you to add breadcrumbs in controllers and views.

In order to add breadcrumbs in controller use breadcrumb method (see 2.1).

class Blog::CategoriesController < ApplicationController

  breadcrumb "Article Categories", :blog_categories_path, only: [:show]

  def show
    breadcrumb @category.title, blog_category_path(@category)
  end
end

Then in your view render the breadcrumbs trail using breadcrumb_trail

2. API

2.1 breadcrumb

Creation of breadcrumb in Rails is achieved by the breadcrumb helper.

The breadcrumb method takes at minimum two arguments: the first is a name for the crumb that will be displayed and the second is a url that the name points to. The url parameter uses the familiar Rails conventions.

When using path variable blog_categories_path:

breadcrumb "Categories", blog_categories_path

When using an instance @category:

breadcrumb @category.title, blog_category_path(@category)

You can also use set of objects:

breadcrumb @category.title, [:blog, @category]

You can specify segments of the url:

breadcrumb @category.title, {controller: "categories", action: "show", id: @category.id}

2.1.1 controller

Breadcrumbs are inherited, so if you set a breadcrumb in ApplicationController, it will be inserted as a first element inside every breadcrumb trail. It is customary to set root breadcrumb like so:

class ApplicationController < ActionController::Base
  breadcrumb "Home", :root_path
end

Outside of controller actions the breadcrumb helper behaviour is similar to filters/actions and as such you can limit breadcrumb scope with familiar options :only, :except. Any breadcrumb specified inside actions creates another level in breadcrumbs trail.

class ArticlesController < ApplicationController
  breadcrumb "All Articles", :articles_path, only: [:new, :create]
end

Each time you call the breadcrumb helper, a new element is added to a breadcrumb trial stack:

class ArticlesController < ApplicationController
  breadcrumb "Home", :root_path
  breadcrumb "All Articles", :articles_path

  def show
    breadcrumb "Article One", article_path(:one)
    breadcrumb "Article Two", article_path(:two)
  end
end

Loaf allows you to call controller instance methods inside the breadcrumb helper outside of any action. This is useful if your breadcrumb has parameterized behaviour. For example, to dynamically evaluate parameters for breadcrumb title do:

class CommentsController < ApplicationController
  breadcrumb -> { find_article(params[:post_id]).title }, :articles_path
end

Also, to dynamically evaluate parameters inside the url argument do:

class CommentsController < ApplicationController
  breadcrumb "All Comments", -> { post_comments_path(params[:post_id]) }
end

You may wish to define breadcrumbs over a collection. This is easy within views, and controller actions (just loop your collection), but if you want to do this in the controller class you can use the before_action approach:

before_action do
  ancestors.each do |ancestor|
    breadcrumb ancestor.name, [:admin, ancestor]
  end
end

Assume ancestors method is defined inside the controller.

2.1.2 view

Loaf adds breadcrumb helper also to the views. Together with controller breadcrumbs, the view breadcrumbs are appended as the last in breadcrumb trail. For instance, to specify view breadcrumb do:

<% breadcrumb @category.title, blog_category_path(@category) %>

2.1.3 :match

Loaf allows you to define matching conditions in order to make a breadcrumb current with the :match option.

The :match key accepts the following values:

  • :inclusive - the default value, which matches nested paths
  • :exact - matches only the exact same path
  • :exclusive - matches only direct path and its query parameters if present
  • /regex/ - matches based on regular expression
  • {foo: bar} - match based on query parameters

For example, to force a breadcrumb to be the current regardless do:

breadcrumb "New Post", new_post_path, match: :exact

To make a breadcrumb current based on the query parameters do:

breadcrumb "Posts", posts_path(order: :desc), match: {order: :desc}

2.2 breadcrumb_trail

In order to display breadcrumbs use the breadcrumb_trail view helper. It accepts optional argument of configuration options and can be used in two ways.

One way, given a block it will yield all the breadcrumbs in order of definition:

breadcrumb_trail do |crumb|
  ...
end

The yielded parameter is an instance of Loaf::Crumb object with the following methods:

crumb.name     # => the name as string
crumb.path     # => the path as string
crumb.url      # => alias for path
crumb.current? # => true or false

For example, you can add the following semantic markup to show breadcrumbs using the breadcrumb_trail helper like so:

<nav aria-label="breadcrumb">
  <ol class="breadcrumbs">
    <% breadcrumb_trail do |crumb| %>
      <li class="<%= crumb.current? ? "current" : "" %>">
        <%= link_to crumb.name, crumb.url, (crumb.current? ? {"aria-current" => "page"} : {}) %>
        <% unless crumb.current? %><span>::</span><% end %>
      </li>
    <% end %>
  </ol>
</nav>

For Bootstrap 4:

<% #erb %>
<nav aria-label="breadcrumb">
  <ol class="breadcrumb">
    <% breadcrumb_trail do |crumb| %>
      <li class="breadcrumb-item <%= crumb.current? ? "active" : "" %>">
        <%= link_to_unless crumb.current?, crumb.name, crumb.url, (crumb.current? ? {"aria-current" => "page"} : {}) %>
      </li>
    <% end %>
  </ol>
</nav>

And, if you are using HAML do:

  - # haml
  %ol.breadcrumb
    - breadcrumb_trail do |crumb|
      %li.breadcrumb-item{class: crumb.current? ? "active" : "" }
        = link_to_unless crumb.current?, crumb.name, crumb.url, (crumb.current? ? {"aria-current" => "page"} : {})

Usually best practice is to put such snippet inside its own _breadcrumbs.html.erb partial.

The second way is to use the breadcrumb_trail without passing a block. In this case, the helper will return an enumerator that you can use to, for example, access an array of names pushed into the breadcrumb trail in order of addition. This can be handy for generating page titles from breadcrumb data.

For example, you can define a breadcrumbs_to_title method in ApplicationHelper like so:

module ApplicationHelper
  def breadcrumbs_to_title
    breadcrumb_trail.map(&:name).join(">")
  end
end

Use whichever of the two ways is more convenient given your application structure and needs.

3. Configuration

There is a small set of custom opinionated defaults. The following options are valid parameters:

:match # set match type, default :inclusive (see [:match](#213-match) for more details)

You can override them in your views by passing them to the view breadcrumb helper

<% breadcrumb_trail(match: :exclusive) do |name, url, styles| %>
  ..
<% end %>

or by configuring an option in config/initializers/loaf.rb:

Loaf.configure do |config|
  config.match = :exclusive
end

4. Translation

You can use locales files for breadcrumbs' titles. Loaf assumes that all breadcrumb names are scoped inside breadcrumbs namespace inside loaf scope. However, this can be easily changed by passing scope: 'new_scope_name' configuration option.

en:
  loaf:
    breadcrumbs:
      name: 'my-breadcrumb-name'

Therefore, in your controller/view you would do:

class Blog::CategoriesController < ApplicationController
  breadcrumb 'blog.categories', :blog_categories_path
end

And corresponding entry in locale would be:

en:
  loaf:
    breadcrumbs:
      blog:
        categories: 'Article Categories'

Contributing

Questions or problems? Please post them on the issue tracker. You can contribute changes by forking the project and submitting a pull request. You can ensure the tests are passing by running bundle and rake.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the Loaf project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.

Copyright

Copyright (c) 2011 Piotr Murach. See LICENSE.txt for further details.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].