Sha256: 259bea87a7e3534d7646ee819163115276e4a84ca17ee6946975d2ffe2decd00

Contents?: true

Size: 1.49 KB

Versions: 2

Compression:

Stored size: 1.49 KB

Contents

# frozen_string_literal: true

module Tramway
  # Provides form object for Tramway
  #
  class BaseForm
    attr_reader :object

    %i[model_name to_key to_model errors attributes].each do |method_name|
      delegate method_name, to: :object
    end

    def initialize(object)
      @object = object
    end

    class << self
      def property(attribute, _proc_obj = nil)
        @properties ||= []
        @properties << attribute

        delegate attribute, to: :object
      end

      def properties(*attributes)
        if attributes.any?
          attributes.each do |attribute|
            property(attribute)
          end
        else
          @properties || []
        end
      end
    end

    def submit(params)
      __submit params

      object.save.tap do
        __object
      end
    end

    def submit!(params)
      __submit params

      object.save!.tap do
        __object
      end
    end

    def method_missing(method_name, *args)
      if method_name.to_s.end_with?('=') && args.count == 1
        object.public_send(method_name, args.first)
      else
        super
      end
    end

    def respond_to_missing?(method_name, include_private = false)
      method_name.to_s.end_with?('=') || super
    end

    private

    def __submit(params)
      self.class.properties.each do |attribute|
        public_send("#{attribute}=", params[attribute]) if params.keys.include? attribute.to_s
      end
    end

    def __object
      object.persisted? ? object.reload : object
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tramway-0.3.1.2 lib/tramway/base_form.rb
tramway-0.3.1.1 lib/tramway/base_form.rb