75 lines
2.5 KiB
Ruby
75 lines
2.5 KiB
Ruby
module SimpleForm
|
|
module ActionViewExtensions
|
|
# This module creates simple form wrappers around default form_for and fields_for.
|
|
#
|
|
# Example:
|
|
#
|
|
# simple_form_for @user do |f|
|
|
# f.input :name, :hint => 'My hint'
|
|
# end
|
|
#
|
|
module FormHelper
|
|
# based on what is done in formtastic
|
|
# http://github.com/justinfrench/formtastic/blob/master/lib/formtastic.rb#L1706
|
|
@@default_field_error_proc = nil
|
|
|
|
# Override the default ActiveRecordHelper behaviour of wrapping the input.
|
|
# This gets taken care of semantically by adding an error class to the wrapper tag
|
|
# containing the input.
|
|
#
|
|
FIELD_ERROR_PROC = proc do |html_tag, instance_tag|
|
|
html_tag
|
|
end
|
|
|
|
def simple_form_for(record, options={}, &block)
|
|
options[:builder] ||= SimpleForm::FormBuilder
|
|
options[:html] ||= {}
|
|
unless options[:html].key?(:novalidate)
|
|
options[:html][:novalidate] = !SimpleForm.browser_validations
|
|
end
|
|
options[:html][:class] = [SimpleForm.form_class, simple_form_css_class(record, options)].compact.join(" ")
|
|
|
|
with_simple_form_field_error_proc do
|
|
form_for(record, options, &block)
|
|
end
|
|
end
|
|
|
|
def simple_fields_for(record_name, record_object = nil, options = {}, &block)
|
|
options, record_object = record_object, nil if record_object.is_a?(Hash) && record_object.extractable_options?
|
|
options[:builder] ||= SimpleForm::FormBuilder
|
|
|
|
with_simple_form_field_error_proc do
|
|
fields_for(record_name, record_object, options, &block)
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def with_simple_form_field_error_proc
|
|
@@default_field_error_proc = ::ActionView::Base.field_error_proc
|
|
::ActionView::Base.field_error_proc = FIELD_ERROR_PROC
|
|
result = yield
|
|
::ActionView::Base.field_error_proc = @@default_field_error_proc
|
|
result
|
|
end
|
|
|
|
def simple_form_css_class(record, options)
|
|
html_options = options[:html]
|
|
as = options[:as]
|
|
|
|
if html_options.key?(:class)
|
|
html_options[:class]
|
|
elsif record.is_a?(String) || record.is_a?(Symbol)
|
|
as || record
|
|
else
|
|
record = record.last if record.is_a?(Array)
|
|
action = record.respond_to?(:persisted?) && record.persisted? ? :edit : :new
|
|
as ? "#{action}_#{as}" : dom_class(record, action)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
ActionView::Base.send :include, SimpleForm::ActionViewExtensions::FormHelper
|