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.
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
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.
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
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}]
}
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
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.
- 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