Terra
Terra is a form builder.
Form DSL
Configure your form with a Ruby DSL like so.
form = Terra::Form.new
form.configure do
text :name, "Name"
text :email, "Email address"
fieldset :options, "Options" {
textarea :body, "Body", :class => "hello"
options :type, "Type",
:options => {
:red => "Red",
:blue => "Blue"
}
}
end
Using in Aura models
Using in Aura models
In your models, simply use the form
method to enclose
the Terra form DSL in.
class BlogPost < Sequel::Model
form {
text :title, "Title"
text :body, "Body"
}
end
Accessing
You'll then be able to access it like so:
BlogPost.form
BlogPost.form.fieldsets
AuraEditable
In Aura, by default, if you model uses the AuraEditable plugin, simply define a form and you'll have new/edit pages in the admin for your model, automagically.
[app/models/book.rb (rb)]
class Book < Sequel::Model
plugin :aura_editable
form {
# ...
}
end
Info
Defining fields
Where text
is the type of field, :id
is the name of the
field, "Field name"
is what's to be displayed, and
{ options_hash }
is an optional list of settings. The field
type can be any of text
|textarea
|options
|checkbox
.
form {
text :id, "Field name", { options_hash }
textarea :body, "Body text"
options :category, "Category"
}
View example
You'll then be able to use it in your views like so:
[app/views/_form.haml (haml)]
- form.fieldsets.each do |set|
-# The fieldset title
%h3= set.to_s
-# Form fields (generates <p>..<label>..<input> for each field)
- set.fields.each do |field|
= field.to_html
Methods
Form methods
Here are some more useful Form (Terra) methods.
form.fieldsets # Returns an array of fieldsets
set = form.fieldset(:default) # Returns a fieldset by name
Fieldset methods
Here are some more useful Fieldset (Terra) methods.
set.fields # Returns a fieldset's fields
set.to_html # Returns <fieldset>..</fieldset> HTML
set.to_html(object) # Same as above, but tries to get data from `object.field_name`
set.name # Returns the name of the field
field = set.field(:name) # Returns a field by name
Field methods
Here are some more useful Field (Terra) methods.
field.to_html # <p>..<label>..<input>..</p>
field.to_html(val) # Like above, but with a certain value
field.input_html # just <input>
field.label_html # just <label>
No, there's no form.to_html
. Geez, don't even think about it--
just render each of the fields/fieldsets.
In practice
HAML example
This is how you would render a form in HAML.
[app/views/_form.haml (haml)]
%form{ :method => 'post', :action => '/save' }
- form.fieldsets.each do |set|
!~ set.to_html(@object)
%p.submit
%button{ :type => 'submit' } Save
# HAML tip: use !~ instead of = to have your textareas
# flow correctly by supressing HAML's extra whitespaces.
More
[app/views/_form.haml (haml)]
= form.fieldsets.first.to_html
= form.fieldsets.first.fields.first.to_html
= form.fieldset(:default).to_html
= form.fieldset(:default).field(:name).to_html
= form.fieldset(:default).field(:name).to_html("Hello") # value
Fields
Text
Text fields
form.configure {
text :name
text :name, "First name"
text :name, "First name", :class => 'title'
}
Options
For dropdowns and radio buttons and such
form.configure {
options :category, "Category"
# Choosing how to render it
options :category, "Category", :type => 'radio'
options :category, "Category", :type => 'dropdown'
# Giving an options hash
options :category, "Category", :options =>
{ 'a' => 'Apple', 'b' => 'Banana' }
# Or a hash array
options :category, "Category", :options =>
[{ 'a' => 'Apple'},
{ 'b' => 'Banana' }
].to_hash_array
# Or lambda
options :category, "Category", :options =>
lambda { |record|
Categories.all.map { |c| { c.id => c.name } }.to_hash_array
}
# Not implemented yet
options :category, "Category", :multi => true
}
Classes
Modules
- Fields A module that is the namespace for all types of fields.