class Aerogel::Forms::FormObject

FormObject represents a model object associated with current form context. It provides access to model object fields and helper methods to form proper html.

Example:

form for: objectA  <- FormObject
  nested form for: objectB  <- FormObject
  list of nested form for collection: objectC1, objectC2..., objecCN

Constants

DEFAULT_OPTIONS
RESERVED_FIELDS

Attributes

field_prefix[RW]
object[RW]
options[RW]
parent[RW]
relation[RW]
style[RW]

Public Class Methods

new( object, parent = nil, relation = nil, options = {}, &block ) click to toggle source
Calls superclass method
# File lib/aerogel/forms/form_object.rb, line 21
def initialize( object, parent = nil, relation = nil, options = {}, &block )
  super( &block )
  self.object = object
  self.parent = parent
  self.relation = relation
  default_options = DEFAULT_OPTIONS.dup
  default_options[:style] = parent.style unless parent.nil?
  @options = default_options.deep_merge( options )
  @style = @options[:style].to_sym
  @first_input = nil
  @field_prefix = options[:field_prefix] || make_field_prefix
end

Public Instance Methods

data_field( name, options = {} ) click to toggle source
# File lib/aerogel/forms/form_object.rb, line 99
def data_field( name, options = {} )
  FormField.new self, name, options
end
field( name, options = {} ) click to toggle source
# File lib/aerogel/forms/form_object.rb, line 34
def field( name, options = {} ) # -> Field
  f = data_field name, options
  unless @first_input || options.key?( :readonly )
    @first_input = f
    f.options[:autofocus] = nil
  end
  erb template( :field, f.options ), locals: { field: f, form_builder: self }, layout: false
end
fields( *args ) click to toggle source

Renders fields listed in the arguments.

# File lib/aerogel/forms/form_object.rb, line 45
def fields( *args )
  args = object.attribute_names - RESERVED_FIELDS if args.size == 0
  output = ''
  args.each do |f|
    output += field f
  end
  output
end
fieldset( name_or_object, opts = {}, &block ) click to toggle source
# File lib/aerogel/forms/form_object.rb, line 54
def fieldset( name_or_object, opts = {}, &block )
  # TODO: if name.nil?
  if name_or_object.is_a? Symbol
    name = name_or_object
    if data_field( name ).is_collection?
      i = 0
      object.send( name ).each do |o|
        Fieldset.new( o, self, name, opts.merge( object_index: o.id ), &block ).render
        i += 1
      end
    else
      o = object.send( name )
      opts[:object_index] ||= o.id
      Fieldset.new( object.send( name ), self, name, opts, &block ).render
    end
  else
    # create new fieldset for given object with no parent
    o = name_or_object
    opts[:object_index] ||= o.id
    Fieldset.new( name_or_object, opts[:parent] || self, opts[:name], opts, &block ).render
  end
end
id() click to toggle source

Returns data object id, degrading to self.object_id

# File lib/aerogel/forms/form_object.rb, line 105
def id
  object.send(:id) rescue self.object_id
end
invalid?() click to toggle source

Returns true if the object is not valid, i.e. contains errors.

# File lib/aerogel/forms/form_object.rb, line 118
def invalid?
  not valid?
end
object_name() click to toggle source

Returns data object name. If the object name is not explicitly specified, it is inferred from the model name.

# File lib/aerogel/forms/form_object.rb, line 81
def object_name
  return @object_name if @object_name
  if @options[:object_name]
    @object_name = @options[:object_name]
  elsif object.respond_to? :model_name
    @object_name = object.model_name.singular
  else
    @object_name = nil
  end
  @object_name
end
root_object?() click to toggle source

Returns true if current form object is the root.

# File lib/aerogel/forms/form_object.rb, line 95
def root_object?
  parent.nil?
end
template( name, opts = {} ) click to toggle source
# File lib/aerogel/forms/form_object.rb, line 122
def template( name, opts = {} )
  style = opts[:style] || @style
  "form_builder/#{style}/#{name}".to_sym
end
valid?() click to toggle source

Returns true if the object contains no errors.

# File lib/aerogel/forms/form_object.rb, line 111
def valid?
  # object.send(:valid?) rescue true # if valid? not supported
  !object.respond_to?(:errors) || object.errors.nil? || object.errors.size == 0
end

Private Instance Methods

make_field_prefix() click to toggle source

Generates field prefix for object fields.

# File lib/aerogel/forms/form_object.rb, line 132
def make_field_prefix
  if root_object?
    # root
    object_name
  elsif parent.data_field( relation ).is_collection?
    # 1 - N, accepts nested attributes
    if parent.object.respond_to? :"#{relation}_attributes="
      parent.field_prefix+"[#{relation}_attributes][#{options[:object_index]}]"
    else
      parent.field_prefix+"[#{relation}][#{options[:object_index]}]"
    end
  else
    # 1 - 1
    parent.field_prefix+"[#{relation}][]"
  end
end