Sinatra::FormHelpers - Lightweight form helpers for Sinatra
This plugin adds lightweight (3-5 lines each) form helpers to Sinatra that aid with common form and HTML tags.
link "google", "http://www.google.com" # <a href="http://www.google.com">google</a>
label :person, :first_name # <label for="person_first_name">First Name</label>
input :person, :first_name # <input name="person[first_name]" id="person_first_name" type="text" />
There are also helpers for: form, textarea, submit, image, radio, checkbox, and select
Why Bother?
After all, you can just write Haml or write your own helpers or hand-code raw HTML or whatever. Well, here's some considerations:
- Helpers maintain correct state across form submissions (eg, on errors, form stays filled in)
- Generate automatic labels, valid CSS ID's, and
nested[names]
to make ORMs happy - No Rails ultra-magic(tm) here. Just fast, simple code.
Usage
With Bundler/Isolate:
gem 'sinatra-formhelpers-huii'
Then, include it in a Sinatra application:
require 'sinatra/form_helpers'
If you're subclassing Sinatra::Base
, you also need to call helpers
manually:
class MyApp < Sinatra::Base
helpers Sinatra::FormHelpers
# ...
end
Views
In your views, use these helpers to dynamically create form HTML elements. Here's an example in ERB:
<p>
Fill out the below form to sign up.
For more information, visit our <%= link 'FAQ', '/faq' %>
</p>
<%= form('/users', :post) %>
<%= input(:user, :first_name) %>
<%= input(:user, :last_name) %>
<%= input(:user, :email, :size => 40) %>
<%= password(:user, :password) %>
<%= password(:user, :confirm_password) %>
<%= radio(:user, :gender, ['M', 'F']) %>
<%= submit %>
Unlike the super-magic Rails form_for
method, the form()
helper just takes a URL and method. (Note that form()
will accept :create
, :update
, and :delete
and include the special _method
hidden param for you.)
To reduce repetition, use fieldset()
to prefix fields with a namespace:
<%= form('/users', :create) %>
<% fieldset(:user) do |f| %>
<%= f.input(:first_name) %>
<%= f.input(:last_name) %>
<%= f.input(:email, :size => 40) %>
<%= f.password(:password) %>
<%= f.password(:confirm_password) %>
<%= f.radio(:gender, ['M', 'F']) %>
<% end %>
</form> <-- You need to close it manually if you are not passing a block
<%= submit 'Create account' %>
<%= submit 'Cancel', :onclick => 'window.location=http://mydomain.com;return false' %>
or
<%= form(:user, :post, action: '/users') do |f| %> <-- This will create a fieldset automatically
<%= f.input(:first_name) %>
<%= f.input(:last_name) %>
<%= f.input(:email, :size => 40) %>
<%= f.password(:password) %>
<%= f.password(:confirm_password) %>
<%= f.radio(:gender, ['M', 'F']) %>
<% end %>
<%= submit 'Create account' %>
<%= submit 'Cancel', :onclick => 'window.location=http://mydomain.com;return false' %>
This will create fields named user[first_name]
, user[last_name]
, and so forth.
List of helpers so far
form
fieldset
link
image
label
input
password
email
textarea
submit
reset
button
checkbox
radio
select
hidden
Known Bugs
fieldset
must be optional inform
<%= form(:user, :post, action: '/users') do |f| %>
doesn't work in eRB, but works in Slim. Crap. :/
Fixed Bugs
- Currently
fieldset
does not return a - The state of select tags was not persisted across form submissions.
Running tests
Just run bundle exec rake
or bundle exec rspec
or rspec
.
Authors
- Initial efforts (c) 2009 Tom Wilson.
- Additional efforts (c) 2011 Nate Wiger.
- Further efforts (c) 2013 Cymen Vig.
- Other efforts (c) 2014 Oldrich Vetesnik.