Parent

Files

Padrino::Helpers::FormBuilder::AbstractFormBuilder

Attributes

multipart[RW]
object[RW]
template[RW]

Public Class Methods

new(template, object, options={}) click to toggle source
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 7
def initialize(template, object, options={})
  @template = template
  @object   = build_object(object)
  @options  = options
  raise "FormBuilder template must be initialized!" unless template
  raise "FormBuilder object must not be a nil value. If there's no object, use a symbol instead! (i.e :user)" unless object
end

Protected Class Methods

field_types() click to toggle source

Returns the known field types for a formbuilder

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 181
def self.field_types
  [:hidden_field, :text_field, :text_area, :password_field, :file_field, :radio_button, :check_box, :select]
end

Public Instance Methods

check_box(field, options={}) click to toggle source

f.check_box :remember_me, :value => 'true', :uncheck_value => '0'

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 124
def check_box(field, options={})
  html = ActiveSupport::SafeBuffer.new
  unchecked_value = options.delete(:uncheck_value) || '0'
  options.reverse_merge!(:id => field_id(field), :value => '1')
  options.reverse_merge!(:checked => true) if values_matches_field?(field, options[:value])
  html << @template.hidden_field_tag(options[:name] || field_name(field), :value => unchecked_value, :id => nil)
  html << @template.check_box_tag(field_name(field), options)
end
check_box_group(field, options={}) click to toggle source

f.check_box_group :color, :options => ['red', 'green', 'blue'], :selected => ['red', 'blue'] f.check_box_group :color, :collection => @colors, :fields => [:name, :id]

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 100
def check_box_group(field, options={})
  selected_values = Array(options[:selected] || field_value(field))
  if options[:collection]
    fields = options[:fields] || [:name, :id]
    # don't use map!, it will break some orms
    selected_values = selected_values.map{ |v| (v.respond_to?(fields[0]) ? v.send(fields[1]) : v).to_s }
  end
  labeled_group( field, options ) do |variant|
    @template.check_box_tag( field_name(field)+'[]', :value => variant[1], :id => variant[2], :checked => selected_values.include?(variant[1]) )
  end
end
csrf_token_field() click to toggle source
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 175
def csrf_token_field
  @template.csrf_token_field
end
email_field(field, options={}) click to toggle source
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 58
def email_field(field, options={})
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
  options.merge!(:class => field_error(field, options))
  @template.email_field_tag field_name(field), options
end
error_message_on(field, options={}) click to toggle source

f.error_message_on(field)

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 22
def error_message_on(field, options={})
  @template.error_message_on(object, field, options)
end
error_messages(*params) click to toggle source

f.error_messages

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 16
def error_messages(*params)
  params.unshift object
  @template.error_messages_for(*params)
end
fields_for(child_association, instance_or_collection=nil, &block) click to toggle source

Supports nested fields for a child model within a form f.fields_for :addresses f.fields_for :addresses, address f.fields_for :addresses, @addresses

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 164
def fields_for(child_association, instance_or_collection=nil, &block)
  default_collection = self.object.send(child_association)
  include_index = default_collection.respond_to?(:each)
  nested_options = { :parent => self, :association => child_association }
  nested_objects = instance_or_collection ? Array(instance_or_collection) : Array(default_collection)
  result = nested_objects.each_with_index.map do |child_instance, index|
    nested_options[:index] = include_index ? index : nil
    @template.fields_for(child_instance,  { :nested => nested_options }, &block)
  end.join("\n").html_safe
end
file_field(field, options={}) click to toggle source

f.file_field :photo, :class => 'avatar'

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 141
def file_field(field, options={})
  self.multipart = true
  options.reverse_merge!(:id => field_id(field))
  options.merge!(:class => field_error(field, options))
  @template.file_field_tag field_name(field), options
end
hidden_field(field, options={}) click to toggle source

f.hidden_field :session_id, :value => "45"

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 33
def hidden_field(field, options={})
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
  @template.hidden_field_tag field_name(field), options
end
image_submit(source, options={}) click to toggle source

f.image_submit "buttons/submit.png", :class => 'large'

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 156
def image_submit(source, options={})
  @template.image_submit_tag source, options
end
label(field, options={}, &block) click to toggle source

f.label :username, :caption => "Nickname"

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 27
def label(field, options={}, &block)
  options.reverse_merge!(:caption => "#{field_human_name(field)}: ")
  @template.label_tag(field_id(field), options, &block)
end
number_field(field, options={}) click to toggle source
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 45
def number_field(field, options={})
   options.reverse_merge!(:value => field_value(field), :id => field_id(field))
   options.merge!(:class => field_error(field, options))
   @template.number_field_tag field_name(field), options
 end
password_field(field, options={}) click to toggle source

f.password_field :password, :id => 'password'

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 84
def password_field(field, options={})
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
  options.merge!(:class => field_error(field, options))
  @template.password_field_tag field_name(field), options
end
phone_field(field, options={}) click to toggle source
Alias for: telephone_field
radio_button(field, options={}) click to toggle source

f.radio_button :gender, :value => 'male'

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 134
def radio_button(field, options={})
  options.reverse_merge!(:id => field_id(field, options[:value]))
  options.reverse_merge!(:checked => true) if values_matches_field?(field, options[:value])
  @template.radio_button_tag field_name(field), options
end
radio_button_group(field, options={}) click to toggle source

f.radio_button_group :color, :options => ['red', 'green'] f.radio_button_group :color, :collection => @colors, :fields => [:name, :id], :selected => @colors.first

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 114
def radio_button_group(field, options={})
  fields = options[:fields] || [:name, :id]
  selected_value = options[:selected] || field_value(field)
  selected_value = selected_value.send(fields[1])  if selected_value.respond_to?(fields[0])
  labeled_group( field, options ) do |variant|
    @template.radio_button_tag( field_name(field), :value => variant[1], :id => variant[2], :checked => variant[1] == selected_value.to_s )
  end
end
search_field(field, options={}) click to toggle source
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 64
def search_field(field, options={})
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
  options.merge!(:class => field_error(field, options))
  @template.search_field_tag field_name(field), options
end
select(field, options={}) click to toggle source

f.select :color, :options => ['red', 'green'], :include_blank => true f.select :color, :collection => @colors, :fields => [:name, :id]

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 92
def select(field, options={})
  options.reverse_merge!(:id => field_id(field), :selected => field_value(field))
  options.merge!(:class => field_error(field, options))
  @template.select_tag field_name(field), options
end
submit(*args) click to toggle source

f.submit "Update", :class => 'large'

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 149
def submit(*args)
  options = args[-1].is_a?(Hash) ? args.pop : {}
  caption = args.length >= 1 ? args.shift : "Submit"
  @template.submit_tag caption, options
end
telephone_field(field, options={}) click to toggle source
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 51
def telephone_field(field, options={})
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
  options.merge!(:class => field_error(field, options))
  @template.telephone_field_tag field_name(field), options
end
Also aliased as: phone_field
text_area(field, options={}) click to toggle source

f.text_area :summary, :value => "(enter summary)", :id => 'summary'

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 77
def text_area(field, options={})
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
  options.merge!(:class => field_error(field, options))
  @template.text_area_tag field_name(field), options
end
text_field(field, options={}) click to toggle source

f.text_field :username, :value => "(blank)", :id => 'username'

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 39
def text_field(field, options={})
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
  options.merge!(:class => field_error(field, options))
  @template.text_field_tag field_name(field), options
end
url_field(field, options={}) click to toggle source
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 70
def url_field(field, options={})
  options.reverse_merge!(:value => field_value(field), :id => field_id(field))
  options.merge!(:class => field_error(field, options))
  @template.url_field_tag field_name(field), options
end

Protected Instance Methods

build_object(object_or_symbol) click to toggle source

explicit_object is either a symbol or a record Returns a new record of the type specified in the object

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 246
def build_object(object_or_symbol)
  object_or_symbol.is_a?(Symbol) ? @template.instance_variable_get("@#{object_or_symbol}") || object_class(object_or_symbol).new : object_or_symbol
end
field_error(field, options) click to toggle source

Add a :invalid css class to the field if it contain an error

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 192
def field_error(field, options)
  error = @object.errors[field] rescue nil
  error.blank? ? options[:class] : [options[:class], :invalid].flatten.compact.join(" ")
end
field_human_name(field) click to toggle source

Returns the human name of the field. Look that use builtin I18n.

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 198
def field_human_name(field)
  I18n.translate("#{object_model_name}.attributes.#{field}", :count => 1, :default => field.to_s.humanize, :scope => :models)
end
field_id(field=nil, value=nil) click to toggle source

Returns the id for the given field field_id(:username) => "user_username" field_id(:gender, :male) => "user_gender_male" field_name(:number) => "user_telephone_attributes_number" field_name(:street) => "user_addresses_attributes_0_street"

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 218
def field_id(field=nil, value=nil)
  result = []
  result << "#{@options[:namespace]}_" if @options[:namespace] && root_form?
  result << field_result
  result << field_id_fragment if nested_form?
  result << "_#{field}" unless field.blank?
  result << "_#{value}" unless value.blank?
  result.flatten.join
end
field_name(field=nil) click to toggle source

Returns the name for the given field field_name(:username) => "user" field_name(:number) => "user[number]" field_name(:street) => "user[0]"

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 206
def field_name(field=nil)
  result = field_result
  result << field_name_fragment if nested_form?
  result << "[#{field}]" unless field.blank?
  result.flatten.join
end
field_value(field) click to toggle source

Returns the value for the object's field field_value(:username) => "Joey"

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 240
def field_value(field)
  @object && @object.respond_to?(field) ? @object.send(field) : ""
end
labeled_group(field, options={}) click to toggle source

Builds a group of labels for radios or checkboxes

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 267
def labeled_group(field, options={})
  options.reverse_merge!(:id => field_id(field), :selected => field_value(field))
  options.merge!(:class => field_error(field, options))
  variants = case
  when options[:options]
    options[:options].map{ |caption, value| [caption.to_s, (value||caption).to_s] }
  when options[:collection]
    fields = options[:fields] || [:name, :id]
    options[:collection].map{ |variant| [variant.send(fields.first).to_s, variant.send(fields.last).to_s] }
  else
    []
  end
  variants.inject(''.html_safe) do |html, variant|
    variant[2] = "#{field_id(field)}_#{variant[1]}"
    html << @template.label_tag("#{field_name(field)}[]", :for => variant[2], :caption => "#{yield(variant)} #{variant[0]}")
  end
end
nested_form?() click to toggle source

Returns true if this form object is nested in a parent form

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 234
def nested_form?
  @options[:nested] && @options[:nested][:parent] && @options[:nested][:parent].respond_to?(:object)
end
nested_object_id() click to toggle source

Returns the child object if it exists

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 229
def nested_object_id
  nested_form? && object.respond_to?(:new_record?) && !object.new_record? && object.id
end
object_class(explicit_object) click to toggle source

Returns the class type for the given object

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 257
def object_class(explicit_object)
  explicit_object.is_a?(Symbol) ? explicit_object.to_s.camelize.constantize : explicit_object.class
end
object_model_name(explicit_object=object) click to toggle source

Returns the object's models name

=> user_assignment
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 252
def object_model_name(explicit_object=object)
  explicit_object.is_a?(Symbol) ? explicit_object : explicit_object.class.to_s.underscore.gsub(/\//, '_')
end
root_form?() click to toggle source

Returns true if this form is the top-level (not nested)

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 262
def root_form?
  !nested_form?
end
values_matches_field?(field, value) click to toggle source

Returns true if the value matches the value in the field field_has_value?(:gender, 'male')

# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 187
def values_matches_field?(field, value)
  value.present? && (field_value(field).to_s == value.to_s || field_value(field).to_s == 'true')
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.