Aform lets you define Form Object with validatins and ability save difficult jsons
or form params
to models. You can create Form object with nested forms for storing has_many
associations with parent model.
It was developed for rails-api and ActiveRecord.
Installation
Add this line to your application's Gemfile:
gem 'aform', '~>0.0.7'
And then execute:
$ bundle
Or install it yourself as:
$ gem install aform
Usage
Define Form
Definning form is pretty simple, for instance you have posts wich have comments and comments have likes:
class PostForm < Aform::Form
param :title, :author
validates_presence_of :title, :author
has_many :comments do
param :message, :author
validates_presence_of :message, :author
has_many :likes do
param :author
validates_presence_of :author
end
end
end
Method param
is used for adding params wich will be used for saving models. You can add any validation you need for each param.
Setup controller
class PostsController < ApplicationController
def create
form = PostForm.new(Post.new, params[:post])
if form.save
render json: form.model, status: :created
else
render json: {errors: form.errors}, status: :unprocessable_entity
end
end
def update
post = Post.find(params[:id])
form = PostForm.new(post, params[:post])
if form.save
render json: form.model
else
render json: {errors: form.errors}, status: :unprocessable_entity
end
end
end
Delete nested records
For deleting nested records you should set _destroy
key to true
in nested params:
post = {
title: "Very Cool Post",
author: "John Doe",
comments: [ {id: comment.id, _destroy: true}]
}
Params
Before looking up the param in a given hash, a form object will check for the presence of a method with the name of the param:
post = {
title: "Cool Post",
first_author: "John Doe",
second_author: "Mr. Author"
}
Form Object:
class OtherPostForm < Aform::Form
param :title, :author
def author(attributes)
"#{attributes[:first_author]} and #{attributes[:second_author]}"
end
end
When you need just save method with other name you can use :model_field
option:
param :first_author, model_field: :author
Validations
Aform curruntly support standart ActiveModel validations like:
validates_presence_of :title
validates :count, presence: true, inclusion: [1..100]
And ActiveRecord uniqueness validation validates_uniqueness_of
or validates :title, uniqueness: true
But it doesn't support yet validation with block and a symbol pointing to a method, supporting will be added in short future.
Contributing
- Fork it ( https://github.com/antonversal/aform )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request