View helpers for Ruby applications
View helpers for Ruby applications
Hanami::Helpers supports Ruby (MRI) 3.0+
Add this line to your application’s Gemfile:
gem 'hanami-helpers'
And then execute:
$ bundle
Or install it yourself as:
$ gem install hanami-helpers
Hanami::Helpers
offers a set of utilities to enrich web views.
HTML5 markup generator (#html
).
View:
module Users
class Show
include Hanami::Helpers
def sidebar
html.aside(id: 'sidebar') do
p "Languages", class: 'title'
ul do
li "Italian"
li "English"
end
end
end
end
end
Template:
<%= sidebar %>
Output:
<aside id="sidebar">
<p class="title">Languages</p>
<ul>
<li>Italian</li>
<li>English</li>
</ul>
</aside>
Form generator for HTML5 (#form_for
)
Template:
<%=
form_for :book, routes.books_path do
text_field :title
submit 'Create'
end
%>
Output:
<form action="/books" method="POST" accept-charset="utf-8" id="book-form">
<input type="text" name="book[title]" id="book-id" value="">
<button type="submit">Create</button>
</form>
View:
module Books
class New
include Hanami::Helpers
def form
form_for :book, routes.books_path do
text_field :title
submit 'Create'
end
end
end
end
Template:
<%= form %>
Output:
<form action="/books" method="POST" accept-charset="utf-8" id="book-form">
<input type="text" name="book[title]" id="book-id" value="">
<button type="submit">Create</button>
</form>
Views:
module Books
class New
include Hanami::Helpers
def form
Form.new(:book, routes.books_path)
end
def submit_label
'Create'
end
end
class Edit
include Hanami::Helpers
def form
Form.new(:book, routes.book_path(id: book.id), {book: book}, {method: :patch})
end
def submit_label
'Update'
end
end
end
Templates:
# books/new.html.erb
<%= render partial: 'books/form' %>
# books/edit.html.erb
<%= render partial: 'books/form' %>
# books/_form.html.erb
<%=
form_for form, class: 'form-horizontal' do
text_field :title
submit submit_label
end
%>
Output for new:
<form action="/books" method="POST" accept-charset="utf-8" id="book-form">
<input type="text" name="book[title]" id="book-id" value="">
<button type="submit">Create</button>
</form>
Output for edit:
<form action="/books/23" method="POST" accept-charset="utf-8" id="book-form">
<input type="hidden" name="_method" value="PATCH">
<input type="text" name="book[title]" id="book-id" value="TDD">
<button type="submit">Update</button>
</form>
HTML (#h
), HTML attribute (#ha
) and URL (#hu
) escape helpers.
View:
module Users
class Show
include Hanami::Helpers
def home_page_link
%(<a href="#{ hu(user.home_page_url) }" title="#{ ha(user.name} }'s website">#{ h(user.website_name) }</a>)
end
def code_snippet
raw user.code_snippet
end
end
end
Template:
<%= home_page_link %>
<%= code_snippet %>
Output:
<a href="https://example.org" title="Maria's website">My Blog</a>
<code>puts "Hello, World!"</code>
Hanami and Hanami::Router integration (#routes
).
View:
module Home
class Index
include Hanami::Helpers
def link_to_home
%(<a href="#{ routes.home_path }">Home</a>)
end
end
end
Template:
<%= link_to_home %>
Output:
<a href="/">Home</a>
Format numbers (#format_number
).
View:
module Home
class Index
include Hanami::Helpers
def visitors_count
format_number '1000'
end
end
end
Template:
<p><%= visitors_count %></p>
Output:
<p>1,000</p>
All the Hanami helpers are modules to include.
Most of the time they inject private methods.
This restriction prevents helper methods to be used on the outside (eg. in a template).
We want to encourage developers to use meaningful and simple APIs in their templates.
module Users
class Show
include Hanami::Helpers
end
end
<%= format_number user.followers_count %>
This style increases the complexity of the template and it makes testing hard.
module Users
class Show
include Hanami::Helpers
def followers_count
format_number user.followers_count
end
end
end
<%= followers_count %>
This simplifies the markup.
In order to test the value that will be printed becomes easier: Users::Show#followers_count
.
Hanami::Helpers uses Semantic Versioning 2.0.0
git checkout -b my-new-feature
)git commit -am 'Add some feature'
)git push origin my-new-feature
)Copyright © 2014-2021 Luca Guidi – Released under MIT License
This project was formerly known as Lotus (lotus-helpers
).