Sha256: 069f3808d1043aaea4f371c1621fdae2f59abdc2b1c69384e527f12a9fd88b1f

Contents?: true

Size: 1.67 KB

Versions: 1

Compression:

Stored size: 1.67 KB

Contents

# frozen_string_literal: true

module YAAF
  # Parent class for form objects
  class Form
    include ::ActiveModel::Model
    include ::ActiveModel::Validations::Callbacks
    include ::ActiveRecord::Transactions
    define_model_callbacks :save

    validate :validate_models

    def save(options = {})
      unless options[:validate] == false
        return false if invalid?
      end

      run_callbacks :commit do
        save_in_transaction(options)
      end

      true
    end

    def save!(options = {})
      save(options) || raise(ActiveRecord::RecordNotSaved.new('Failed to save the form', self))
    end

    private

    attr_accessor :models

    def promote_errors(model)
      if rails_version_less_than_6_1?
        model.errors.each do |attribute, message|
          errors.add(attribute, message)
        end
      else
        model.errors.each do |model_error|
          errors.add(model_error.attribute, model_error.message)
        end
      end
    end

    def save_in_transaction(options)
      ::ActiveRecord::Base.transaction do
        run_callbacks :save do
          save_models(options)
        end
      end
    rescue Exception => e
      handle_transaction_rollback(e)
    end

    def save_models(options)
      models.map { |model| model.save!(options) }
    end

    def validate_models
      models.each do |model|
        promote_errors(model) if model.invalid?
      end
    end

    def handle_transaction_rollback(exception)
      run_callbacks :rollback
      raise exception
    end

    def rails_version_less_than_6_1?
      ActiveModel::VERSION::MAJOR < 6 ||
        ActiveModel::VERSION::MAJOR == 6 && ActiveModel::VERSION::MINOR.zero?
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
yaaf-0.2.0 lib/yaaf/form.rb