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