antonversal/aform

View on GitHub
lib/aform/form_saver.rb

Summary

Maintainability
A
35 mins
Test Coverage
module Aform
  class FormSaver
    attr_reader :transaction_klass, :rollback_klass

    def initialize(form, opts = {})
      @transaction_klass = opts[:transaction_klass] ||= ActiveRecord::Base
      @rollback_klass = opts[:rollback_klass] ||= ActiveRecord::Rollback
      @form = form
    end

    def save
      result = false
      @transaction_klass.transaction do
        result =
          if @form.nested_forms
            @form.form_model.save && save_nested(@form).all?
          else
            @form.form_model.save
          end
        raise(@rollback_klass) unless result
      end
      result
    end

    protected

    def save_nested(form)
      form.nested_forms.map do |k, v|
        v.map do |nf|
          result = nf.form_model.save(form.model.send(k))
          save_nested(nf) if nf.nested_forms
          result
        end
      end.flatten
    end
  end
end