Sha256: 9c8d4c17b99ee7bd72746d90f83333c062cc025c5b09c9f208497d78c15ad46e

Contents?: true

Size: 1.56 KB

Versions: 1

Compression:

Stored size: 1.56 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

    delegate :transaction, to: ::ActiveRecord::Base

    validate :validate_models

    def save(options = {})
      save_form(options)
    rescue ActiveRecord::RecordInvalid,
           ActiveRecord::RecordNotSaved,
           ActiveModel::ValidationError

      false
    end

    def save!(options = {})
      save_form(options)
    end

    private

    attr_accessor :models

    def save_form(options)
      validate! unless options[:validate] == false

      run_callbacks :commit do
        save_in_transaction(options)
      end

      true
    end

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

    def save_models(options)
      options.merge!(validate: false)

      models.map do |model|
        if model.respond_to?(:marked_for_destruction?) && model.marked_for_destruction?
          model.destroy!
        else
          model.save!(**options)
        end
      end
    end

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

    def promote_errors(model)
      errors.merge!(model.errors)
    end

    def handle_transaction_rollback(exception)
      run_callbacks :rollback
      raise exception
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

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