module Technoweenie #:nodoc:
module LabeledFormHelper
[:form_for, :fields_for, :form_remote_for, :remote_form_for].each do |meth|
src = <<-end_src
def labeled_#{meth}(object_name, *args, &proc)
options = args.last.is_a?(Hash) ? args.pop : {}
options.update(:builder => LabeledFormBuilder)
#{meth}(object_name, *(args << options), &proc)
end
end_src
module_eval src, __FILE__, __LINE__
end
# Returns a label tag that points to a specified attribute (identified by +method+) on an object assigned to a template
# (identified by +object+). Additional options on the input tag can be passed as a hash with +options+. An alternate
# text label can be passed as a 'text' key to +options+.
# Example (call, result).
# label_for('post', 'category')
#
#
# label_for('post', 'category', 'text' => 'This Category')
#
def label_for(object_name, method, options = {})
ActionView::Helpers::InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_label_tag(options)
end
# Creates a label tag.
# label_tag('post_title', 'Title')
#
def label_tag(name, text, options = {})
content_tag('label', text, { 'for' => name }.merge(options.stringify_keys))
end
end
module LabeledInstanceTag #:nodoc:
def to_label_tag(options = {})
options = options.stringify_keys
add_default_name_and_id(options)
options.delete('name')
options['for'] = options.delete('id')
content_tag 'label', options.delete('text') || @method_name.humanize, options
end
end
module FormBuilderMethods #:nodoc:
def label_for(method, options = {})
@template.label_for(@object_name, method, options.merge(:object => @object))
end
end
class LabeledFormBuilder < ActionView::Helpers::FormBuilder #:nodoc:
(%w(date_select) +
ActionView::Helpers::FormHelper.instance_methods -
%w(label_for hidden_field check_box radio_button form_for fields_for)).each do |selector|
src = <<-end_src
def #{selector}(method, options = {})
@template.content_tag('p', label_for(method) + super)
end
end_src
class_eval src, __FILE__, __LINE__
end
def hidden_field(method, options={})
super
end
def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")
@template.content_tag('p', label_for(method) + "
" + super)
end
def radio_button(method, tag_value, options = {})
@template.content_tag('p', label_for(method) + "
" + super)
end
def select(method, choices, options = {}, html_options = {})
@template.content_tag('p', label_for(method) + "
" + super)
end
def country_select(method, priority_countries = nil, options = {}, html_options = {})
@template.content_tag('p', label_for(method) + "
" + super)
end
def fields_for(object_name, *args, &proc)
@template.labeled_fields_for(object_name, *args, &proc)
end
end
end