FieldableForm is intended to make building an end user facing form builder easier. It provides all the field models necessary for building such functionality and also some erb and js templates for bootstraping the views. Checkout the Example App to see how it work in action.
FieldableForm is only compatiable with Rails 3+.
gem 'fieldable_form'
To use FieldableForm, you will need to implement the following two types of models.
FieldableForm provide an easy way for you to build form models that can have different type of fields.
class ProductForm < ActiveRecord::Base
attr_accessible :fields_attributes
has_many :fields, :class_name => FieldableForm::Field, :as => :fieldable, :dependent => :destroy
accepts_nested_attributes_for :fields, :allow_destroy => true
end
The FieldableForm::Field
provided by FieldableForm is the parent of all other fields, by having a has_many association with it, the form model can have any types of fields and it handles all the STI headaches. You can also implement your own field by inheriting from FieldableForm::Field
as long as you implement the mandatory methods, you can check the source of FieldableForm::Field
for those methods.
The entry model is the model that will hold the values of the fields that user entered through the form. It needs to have an attribute which can holds the field name and value pairs as an hash.
class Product < ActiveRecord::Base
attr_accessible :product_form_id, :properties
belongs_to :product_form
# provides validations for the the entry against the form model
include FieldableForm::EntryValidations
validate_fieldable_form_entry :product_form, :properties
serialize :properties, Hash
end
Then in the views you can use OpenStruct
to render the fields from the product_form
and its corresponding values.
<%= f.fields_for :properties, OpenStruct.new(@product.properties) do |ff| %>
<% @product.product_form.fields.each do |field| %>
<%= render "product_forms/entry/field", f: ff, field: field %>
<% end %>
<% end %>
For more detailed implementation please take a look at the Example App
FieldableForm does not provide any views by default, However you could get a default views and some useful helpers as a starting point.
rails g fieldable_form:bootstrap [underscored_form_model_name]