class ActionView::Helpers::FormBuilder include ActionView::Context include ActionView::Helpers::TagHelper require 'helpers' class_attribute :form_control_fields self.form_control_fields = ActionView::Helpers::FormBuilder.field_helpers - [:label, :check_box, :radio_button, :fields_for, :hidden_field, :file_field] require 'bs_form_builder' def form_group(method=nil, options={}, &block) raise ArgumentError, 'Missing block' unless block_given? method, options = nil, method if method.is_a? Hash form_group_options = options.dup classes = parse_html_classes_to_arr options[:class] add_html_class classes, 'form-group' form_group_options[:class] = classes bs_form_helper = BsFormBuilder.new self, @object_name, method content = @template.capture(bs_form_helper, &block) if method if @object.errors[method].any? add_html_class classes, 'has-error' end if render_validation_error? options content << validation_error(method) end end content_tag :div, content, form_group_options end def validation_error(method) if @object.errors[method].any? errors = @object.errors[method].join(' ') content_tag(:span, errors, class: [:'helper-block', :'text-danger']) end end form_control_fields.each do |selector| class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 def #{selector}(method, options = {}) # def text_field(method, options = {}) field_options = options.dup # field_options = options.dup set_placeholder_and_title method, field_options # set_placeholder_and_title field_options method, field_options if @object.class.validators_on(method).map(&:class).include?(ActiveRecord::Validations::PresenceValidator) if field_options[:required] == nil field_options[:required] = true end end # @template.send( # @template.send( #{selector.inspect}, # "text_field", @object_name, # @object_name, method, # method, objectify_options(field_options)) # objectify_options(options)) end # end RUBY_EVAL end def label(method, text = nil, options = {}, &block) if text.is_a? Hash label_text = nil label_options = text.dup else label_text = text label_options = options.dup end label_classes = parse_html_classes_to_arr label_options[:class] if @object.class.validators_on(method).map(&:class).include?(ActiveRecord::Validations::PresenceValidator) add_html_class label_classes, 'required-label' end label_options[:class] = label_classes @template.label @object_name, method, label_text, label_options, &block end def bs_static_control(method) content_tag :p, @object.send(method), class: 'form-control-static' end private def set_placeholder_and_title(method, options) scope = [:activerecord, :placeholders, object.class.model_name.i18n_key] if options[:placeholder] if options[:placeholder].is_a? Symbol placeholder = I18n.t(options[:placeholder], scope: scope, default: '') else placeholder = options[:placeholder].to_s end else placeholder = I18n.t(method, scope: scope, default: '') end if placeholder.blank? options.delete :placeholder else options[:placeholder] = placeholder options[:title] = placeholder end end def render_validation_error?(options) form_html_options = @options[:html] || {} form_classes = parse_html_classes_to_arr form_html_options[:class] if Twitter::Bootstrap::For::Rails.render_validation_error == false false elsif form_classes.include?('form-inline') || form_classes.include?('form-horizontal') false elsif @options[:render_validation_error] == false false elsif options[:render_validation_error] == false false else true end end end