Project

aform

0.0
No commit activity in last 3 years
No release in over 3 years
Form Object implementation for filling models from JSON with nested arrays
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

Aform Build Status Code Quality

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

  1. Fork it ( https://github.com/antonversal/aform )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request