Object
# 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
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
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
# File lib/padrino-helpers/form_builder/abstract_form_builder.rb, line 175 def csrf_token_field @template.csrf_token_field end
# 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
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
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
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
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
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
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
# 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
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
# 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
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
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
# 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
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
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
# 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
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
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
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
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
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
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
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
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
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
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
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
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
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
Generated with the Darkfish Rdoc Generator 2.