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
endMethod 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
endFor 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
endWhen you need just save method with other name you can use :model_field option:
param :first_author, model_field: :authorAform 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
