module FiForm::BuilderExtensions::ActiveRecord

Public Instance Methods

fields_for(field, options={}, &block) click to toggle source
# File lib/fi_form/builder_extensions/active_record.rb, line 4
def fields_for(field, options={}, &block)
  indent = options[:indent]
  indent = true if indent.nil?

  # build a new record for that association without adding it to the internal collection
  blue_print = capture_target(indent: indent) do
    association = @resource.public_send(field)
    record      = association.klass.new(association.scope_attributes).tap(&:readonly!)
    builder     = sub_builder(record, &block)
    instance_exec(builder, &block)

    add(:blue_print, items: builder.form.items)
  end

  add(:fields_for, options.merge(field: field, blue_print: blue_print)).add_children(indent: indent) do
    # capture fields for every existing record
    resource.public_send(field).each do |sub_resource|
      builder = sub_builder(sub_resource, &block)
      instance_exec(builder, &block)
      @target << builder.form
    end
  end
end

Private Instance Methods

resource_value(field) click to toggle source
# File lib/fi_form/builder_extensions/active_record.rb, line 29
def resource_value(field)
  return unless @resource.respond_to?(field)
  @resource.public_send(field)
end