Base class for Padrino Form Builder
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 9 def initialize(template, object, options={}) @template = template fail "FormBuilder template must be initialized" unless template @object = object.kind_of?(Symbol) ? build_object(object) : object fail "FormBuilder object must be present. If there's no object, use a symbol instead (i.e. :user)" unless object @options = options @namespace = options[:namespace] @model_name = options[:as] || Inflections.underscore(@object.class).tr('/', '_') nested = options[:nested] if @is_nested = nested && (nested_parent = nested[:parent]) && nested_parent.respond_to?(:object) @parent_form = nested_parent @nested_index = nested[:index] @attributes_name = "#{nested[:association]}_attributes" end end
Returns the known field types for a Formbuilder.
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 171 def self.field_types [:hidden_field, :text_field, :text_area, :password_field, :file_field, :radio_button, :check_box, :select, :number_field, :telephone_field, :email_field, :search_field, :url_field, :datetime_field, :datetime_local_field, :date_field, :month_field, :week_field, :time_field, :color_field, ] end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 90 def check_box(field, options={}) options = default_options(field, options, :value => '1') options[:checked] = true if is_checked?(field, options) name = field_name(field) html = @template.hidden_field_tag(name, :value => options.delete(:uncheck_value) || '0') html << @template.check_box_tag(name, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 78 def check_box_group(field, options={}) labeled_group(field, options) do |attributes| @template.check_box_tag(field_name(field)+'[]', attributes) end end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 142 def color_field(field, options={}) @template.color_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 164 def csrf_token_field @template.csrf_token_field end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 126 def date_field(field, options={}) @template.date_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 118 def datetime_field(field, options={}) @template.datetime_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 122 def datetime_local_field(field, options={}) @template.datetime_local_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 54 def email_field(field, options={}) @template.email_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 29 def error_message_on(field, options={}) @template.error_message_on object, field, options end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 25 def error_messages(*params) @template.error_messages_for object, *params end
Supports nested fields for a child model within a form. f.fields_for :addresses f.fields_for :addresses, address f.fields_for :addresses, @addresses f.fields_for :addresses, address, index: i
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 152 def fields_for(child_association, collection=nil, options={}, &block) default_collection = self.object.send(child_association) collection ||= default_collection include_index = default_collection.respond_to?(:each) nested_options = { :parent => self, :association => child_association } Array(collection).each_with_index.inject(SafeBuffer.new) do |all,(child_instance,index)| nested_options[:index] = options[:index] || (include_index ? index : nil) all << @template.fields_for(child_instance, { :nested => nested_options, :builder => self.class }, &block) << "\n" end end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 105 def file_field(field, options={}) self.multipart = true @template.file_field_tag field_name(field), default_options(field, options).reject{ |key, _| key == :value } end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 114 def image_submit(source, options={}) @template.image_submit_tag source, options end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 33 def label(field, options={}, &block) @template.label_tag(field_id(field), { :caption => "#{field_human_name(field)}: " }.update(options), &block) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 130 def month_field(field, options={}) @template.month_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 45 def number_field(field, options={}) @template.number_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 70 def password_field(field, options={}) @template.password_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 58 def search_field(field, options={}) @template.search_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 74 def select(field, options={}) @template.select_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 110 def submit(*args) @template.submit_tag(*args) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 49 def telephone_field(field, options={}) @template.telephone_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 66 def text_area(field, options={}) @template.text_area_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 41 def text_field(field, options={}) @template.text_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 138 def time_field(field, options={}) @template.time_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 62 def url_field(field, options={}) @template.url_field_tag field_name(field), default_options(field, options) end
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 134 def week_field(field, options={}) @template.week_field_tag field_name(field), default_options(field, options) end
Returns a record from template instance or create a record of specified class.
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 234 def build_object(symbol) @template.instance_variable_get("@#{symbol}") || Inflections.constantize(Inflections.camelize(symbol)).new end
Returns the human name of the field. Look that use builtin I18n.
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 181 def field_human_name(field) I18n.translate("#{model_name}.attributes.#{field}", :count => 1, :default => Inflections.humanize(field), :scope => :models) end
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 209 def field_id(field=nil, value=nil) result = (namespace && !is_nested) ? "#{namespace}_" : '' result << field_id_fragment result << "_#{field}" if field result << "_#{value}" if value result end
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 197 def field_name(field=nil) result = field_name_fragment result << "[#{field}]" if field result end
Returns the value for the object’s field.
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 227 def field_value(field) @object.respond_to?(field) ? @object.send(field) : '' end
Builds a group of labels for radios or checkboxes.
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 241 def labeled_group(field, options={}) options = { :id => field_id(field), :selected => field_value(field) }.update(options) options.update(error_class(field)){ |_,*values| values.compact.join(' ') } selected_values = resolve_checked_values(field, options) variants_for_group(options).inject(SafeBuffer.new) do |html, (caption,value)| variant_id = "#{options[:id]}_#{value}" attributes = { :value => value, :id => variant_id, :checked => selected_values.include?(value) } caption = yield(attributes) << ' ' << caption html << @template.label_tag("#{field_name(field)}[]", :for => variant_id, :caption => caption) end end
Returns the child object if it exists.
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 220 def nested_object_id is_nested && object.respond_to?(:new_record?) && !object.new_record? && object.id end
Returns the object’s models name.
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 188 def object_model_name(explicit_object=object) explicit_object.is_a?(Symbol) ? explicit_object : explicit_object.class.to_s.underscore.gsub(/\//, '_') end