class Aform::Form

Attributes

attributes[R]
form_model[R]
model[R]
nested_forms[R]
parent[R]

Public Class Methods

method_missing(meth, *args, &block) click to toggle source
Calls superclass method
# File lib/aform/form.rb, line 54
def method_missing(meth, *args, &block)
  if meth.to_s.start_with?("validate")
    options = {method: meth, options: args}
    options.merge!(block: block) if block_given?
    self.validations ||= []
    self.validations << options
  elsif meth == :has_many
    define_nested_form(args, &block)
  else
    super
  end
end
new(model, attributes, parent = nil, opts = {}) click to toggle source
# File lib/aform/form.rb, line 7
def initialize(model, attributes, parent = nil, opts = {})
  @opts = opts
  @attributes = attributes
  @model = model
  @parent = parent
  assign_opts_instances
  initialize_nested
end
param(*args) click to toggle source
# File lib/aform/form.rb, line 44
def param(*args)
  self.params ||= []
  options = args.extract_options!
  elements = args.map do |a|
    field = {field: a}
    options.present? ? field.merge({options: options}) : field
  end
  self.params += elements
end
primary_key(key) click to toggle source
# File lib/aform/form.rb, line 40
def primary_key(key)
  self.pkey = key
end

Protected Class Methods

define_nested_form(args, &block) click to toggle source
# File lib/aform/form.rb, line 70
def self.define_nested_form(args, &block)
  name = args.shift
  self.nested_form_klasses ||= {}
  class_attribute name
  klass = Class.new(Aform::Form, &block)
  self.send("#{name}=", klass)
  self.nested_form_klasses.merge! name => klass
end

Public Instance Methods

errors() click to toggle source
# File lib/aform/form.rb, line 35
def errors
  @errors.messages
end
invalid?() click to toggle source
# File lib/aform/form.rb, line 27
def invalid?
  !valid?
end
save() click to toggle source
# File lib/aform/form.rb, line 31
def save
  self.valid? && @form_saver.save
end
valid?() click to toggle source
# File lib/aform/form.rb, line 16
def valid?
  if @nested_forms
    main = @form_model.valid?
    #all? don't invoike method on each element
    nested = @nested_forms.values.flatten.map(&:valid?).all?
    main && nested
  else
    @form_model.valid?
  end
end

Private Instance Methods

assign_opts_instances() click to toggle source
# File lib/aform/form.rb, line 81
def assign_opts_instances
  @errors     = @opts[:errors] || Aform::Errors.new(self)
  @form_saver = @opts[:form_saver] || Aform::FormSaver.new(self)
  @form_model = @opts[:form_model] || Aform::Model.\
    build_klass(self.params, self.validations).\
    new(model, self, attributes)
end
initialize_nested() click to toggle source
# File lib/aform/form.rb, line 89
def initialize_nested
  @nested_forms =
    if nested_form_klasses
      nested_form_klasses.inject({}) do |memo, (k, v)|
        if attributes[k]
          nested = attributes[k].map do |attrs|
            v.new(nested_model(k, attrs, v.pkey), attrs, self, @opts)
          end
          memo.merge(k => nested)
        else
          memo
        end
      end
    end
end
nested_model(association, attrs, key) click to toggle source
# File lib/aform/form.rb, line 105
def nested_model(association, attrs, key)
  key = key || :id
  model.send(association).find_by(key => attrs[key]) || \
    association.to_s.classify.constantize.new
end