module ActionView module Helpers module FormHelper def form_for(object_name, *args, &proc) raise ArgumentError, "Missing block" unless block_given? id = args.last[:html][:id] options = args.last.is_a?(Hash) ? args.pop : {} concat(form_tag(options.delete(:url) || {}, options.delete(:html) || {}), proc.binding) fields_for(object_name, *(args << options), &proc) concat('', proc.binding) concat(validation_js(id), proc.binding) end def validation_js(id) s = "\n\n" s end def validated_form_for(name, object, options, &proc) form_for(name, object, options, &proc) end end module PrototypeHelper def remote_form_for(object_name, *args, &proc) id = args.last[:html][:id] options = args.last.is_a?(Hash) ? args.pop : {} concat(form_remote_tag(options), proc.binding) fields_for(object_name, *(args << options), &proc) concat('', proc.binding) concat(validation_js(id), proc.binding) end def validated_remote_form_for(name, object, options, &proc) options = options.merge(:validation => true) remote_form_for(name, object, options, &proc) end def validation_js(id) s = "\n\n" s end def remote_function(options) javascript_options = options_for_ajax(options) update = '' if options[:update] && options[:update].is_a?(Hash) update = [] update << "success:'#{options[:update][:success]}'" if options[:update][:success] update << "failure:'#{options[:update][:failure]}'" if options[:update][:failure] update = '{' + update.join(',') + '}' elsif options[:update] update << "'#{options[:update]}'" end if options[:html] && options[:html][:id] id = options[:html][:id] end validation_str_start = '' validation_str_end = '' if options[:validation] == true validation_str_start = "if(validation_#{id}.validate()){" validation_str_end = "}" end function = update.empty? ? "#{validation_str_start}new Ajax.Request(" : "new Ajax.Updater(#{update}, " url_options = options[:url] url_options = url_options.merge(:escape => false) if url_options.is_a?(Hash) function << "'#{url_for(url_options)}'" function << ", #{javascript_options})#{validation_str_end}" function = "#{options[:before]}; #{function}" if options[:before] function = "#{function}; #{options[:after]}" if options[:after] function = "if (#{options[:condition]}) { #{function}; }" if options[:condition] function = "if (confirm('#{escape_javascript(options[:confirm])}')) { #{function}; }" if options[:confirm] return function end end end end