Module: DynamicFormObjects

Defined in:
lib/dynamic_form_objects.rb,
lib/dynamic_form_objects/version.rb

Constant Summary collapse

VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.define_form(form_name, *args) ⇒ Object

Defines a new form object:

Usage:

UserForm = DynamicFormObjects.define_form(“UserForm”, :first_name, :last_name, :age, :password).with_validations do

validates_presence_of :first_name
validates_presence_of :last_name

end

– or UserForm = DynamicFormObjects.define_form(“UserForm”).

with_validations { validates_presence_of :name}.
with_validations { validates_presence_of :age }

– Create a new instance user_form = UserForm.new user_form = UserForm.new first_name: ‘Foo’, last_name: ‘Bar’

– Check if valid if user_form.valid? …



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/dynamic_form_objects.rb', line 27

def self.define_form(form_name, *args)
  Class.new(Object) do |klass|
    include ActiveModel::Model

    attr_reader(*args)

    @__attrs = args
    @__form_name = form_name

    def self.attrs
      @__attrs
    end

    def self.with_validations(&block)
      class_eval(&block)
      self
    end

    def self.model_name
      ActiveModel::Name.new(self, nil, @__form_name)
    end

    def initialize(opts = {})
      set_instance_variables(opts)
    end

    def to_h
      @__hash_value
    end
    alias_method :to_hash, :to_h

    def persisted?
      false
    end

    def set_instance_variables(opts = {})
      defined_attrs = self.class.attrs
      attrs_and_values = defined_attrs.map{|k| [k, opts[k]]}
      attrs_and_values.each do |k, v|
        instance_variable_set("@#{k.to_s}", v)
      end

      instance_variable_set("@__hash_value", Hash[attrs_and_values])
    end
    private :set_instance_variables
  end
end