V2.1: Helpers


While Hanami views help you keep your view logic close to its associated values via parts, sometimes you need behavior that works with all kinds of values, in all parts of your views. For this, you can use helpers.

Helpers are small, stateless, general purpose methods that are available in templates, parts and scopes. Hanami provides a range of standard helpers, and you can also define your own.

Standard helpers

Hanami provides a range of standard helpers for common aspects of writing views. See Helpers for an overview of these helpers.

For the examples below, we’ll be using the standard format_number helper, which takes a number and turns it into a human-friendly string representation:

format_number(1234) # => "1,234"

Helpers in templates

You can call helpers directly by their method names in your templates:

<p><%= format_number(1234) %></p>

Helper methods will take priority over your view’s exposures. Be mindful of this when naming your exposures and writing your own helper methods.

Helpers in parts

Helpers in parts are available on a helpers object within the part:

def word_count
  # Presuming a `body_text` method on the value wrapped by the part
  helpers.format_number(body_text.split)
end

Making the helpers available via helpers avoids potential naming collisions, since parts can wrap all kinds of different values, each with their own range of different method names.

Helpers in scopes

Like templates, helpers in scopes are available directly as methods:

def post_word_count
  # Presuming a `post` local
  format_number(post.body_text.split)
end

Writing your own helpers

When you generate a new Hanami app, you’ll find a helpers module generated in app/views/helpers.rb:

module MyApp
  module Views
    module Helpers
      # Add your view helpers here
    end
  end
end

Any methods you write inside this module will become available as helpers in all the places outlined above.

If you’d like to further organize your helpers, you can create nested modules and include them explicitly in this helpers module. For example:

module MyApp
  module Views
    module Helpers
      # Defined in app/views/helpers/formatting_helper.rb
      include FormattingHelper
    end
  end
end

This same structure applies within slices as well as the app. When you generate a new slice, you’ll find a corresponding helpers module generated in the slice:

module MySlice
  module Views
    module Helpers
      # Add your view helpers here
    end
  end
end

The methods in this module will become available as helpers in the views within the slice.

To make app-level view helpers available within slices, include the app’s helpers module:

module MySlice
  module Views
    module Helpers
      include MyApp::Views::Helpers
    end
  end
end

Using the view context within helpers

When writing your own helpers, you can access the view context via _context.

The context includes useful app facilities like the inflector:

def my_helper
  _context.inflector.pluralize("greeting")
end

For views rendered within an action, the context also provides the current request:

def current_path?(path)
  path == _context.request.fullpath
end