class Patterns::Form

Constants

Error
Invalid
NoParamKey

Attributes

form_owner[R]
resource[R]

Public Class Methods

new(*args) click to toggle source
Calls superclass method
# File lib/patterns/form.rb, line 13
def initialize(*args)
  attributes = args.extract_options!

  if attributes.blank? && args.last.is_a?(ActionController::Parameters)
    attributes = args.pop.to_unsafe_h
  end

  @resource = args.first

  super(build_original_attributes.merge(attributes))
end
param_key(key = nil) click to toggle source
# File lib/patterns/form.rb, line 72
def self.param_key(key = nil)
  if key.nil?
    @param_key
  else
    @param_key = key
  end
end

Public Instance Methods

as(form_owner) click to toggle source
# File lib/patterns/form.rb, line 35
def as(form_owner)
  @form_owner = form_owner
  self
end
model_name() click to toggle source
# File lib/patterns/form.rb, line 68
def model_name
  @model_name ||= OpenStruct.new(model_name_attributes)
end
persisted?() click to toggle source
# File lib/patterns/form.rb, line 60
def persisted?
  if resource.present? && resource.respond_to?(:persisted?)
    resource.persisted?
  else
    false
  end
end
save() click to toggle source
# File lib/patterns/form.rb, line 25
def save
  valid? ? persist : false
end
save!() click to toggle source
# File lib/patterns/form.rb, line 29
def save!
  save.tap do |saved|
    raise Invalid unless saved
  end
end
to_key() click to toggle source
# File lib/patterns/form.rb, line 40
def to_key
  nil
end
to_model() click to toggle source
# File lib/patterns/form.rb, line 48
def to_model
  self
end
to_param() click to toggle source
# File lib/patterns/form.rb, line 52
def to_param
  if resource.present? && resource.respond_to?(:to_param)
    resource.to_param
  else
    nil
  end
end
to_partial_path() click to toggle source
# File lib/patterns/form.rb, line 44
def to_partial_path
  nil
end

Private Instance Methods

build_original_attributes() click to toggle source
# File lib/patterns/form.rb, line 102
def build_original_attributes
  return {} if resource.nil?
  base_attributes = resource.respond_to?(:attributes) && resource.attributes.symbolize_keys

  self.class.attribute_set.each_with_object(base_attributes || {}) do |attribute, result|
    if result[attribute.name].blank? && resource.respond_to?(attribute.name)
      result[attribute.name] = resource.public_send(attribute.name)
    end
  end
end
model_name_attributes() click to toggle source
# File lib/patterns/form.rb, line 84
def model_name_attributes
  if self.class.param_key.present?
    {
      param_key: self.class.param_key,
      route_key: self.class.param_key.pluralize,
      singular_route_key: self.class.param_key
    }
  elsif resource.present? && resource.respond_to?(:model_name)
    {
      param_key: resource.model_name.param_key,
      route_key: resource.model_name.route_key,
      singular_route_key: resource.model_name.singular_route_key
    }
  else
    raise NoParamKey
  end
end
persist() click to toggle source
# File lib/patterns/form.rb, line 113
def persist
  raise NotImplementedError, "#persist has to be implemented"
end