app/helpers/redde/form_helper.rb
module Redde::FormHelper
# 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 redde_form_for(object, options = {}, &block)
options = make_options(options)
options[:builder] ||= ReddeFormBuilder
options[:html] = { 'data-redde' => { objectName: (object.kind_of?(Array) ? object.last : object).class.model_name.param_key }.to_json }
options[:redde] = {} unless options.key?(:redde)
options[:redde][:submits] = true unless options[:redde].key?(:submits)
with_clean_form_field_error_proc do
form_for(object, options) do |f|
concat f.error_messages
concat content_tag(:table, capture(f, &block).concat(if options[:redde][:submits] then f.redde_submits end), class: 'redde-form__tbl')
end
end
end
def redde_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] ||= ReddeFormBuilder
with_clean_form_field_error_proc do
fields_for(record_name, record_object, options, &block)
end
end
private
def make_options(options)
return options.merge(html: { class: 'redde-form' }) unless options.key?(:html)
unless options[:html].key?(:class)
options[:html][:class] = 'redde-form'
return options
end
if options[:html][:class].is_a? String
options[:html][:class] += ' redde-form'
elsif options[:html][:class].is_a? Array
options[:html][:class] << 'redde-form'
end
options
end
def with_clean_form_field_error_proc
default_field_error_proc = ::ActionView::Base.field_error_proc
begin
::ActionView::Base.field_error_proc = FIELD_ERROR_PROC
yield
ensure
::ActionView::Base.field_error_proc = default_field_error_proc
end
end
end