A skeleton web application configured to use Sinatra and ActiveRecord

SinatraMore::FormHelpers#select_tag: Add support for nested arrays

+53 -3
+9 -3
lib/sinatra_more/markup_plugin/form_helpers.rb
··· 248 248 selected_values = [selected_values].compact 249 249 end 250 250 251 - grouped_option_items.collect{|group| 251 + grouped_option_items.map{|group| 252 + group_caption, opts = if group.is_a?(Hash) 253 + [ group.keys.first, group.values ] 254 + else 255 + [ group[0], group[1 .. -1] ] 256 + end 257 + 252 258 content_tag(:optgroup, 253 - group[1].collect{|caption, value| 259 + opts.map{|caption| 254 260 value ||= caption 255 261 selected = selected_values.find{|v| 256 262 v.to_s.match(/^(#{value}|#{caption})$/) ··· 258 264 content_tag(:option, caption, :value => value, 259 265 :selected => !!selected) 260 266 }.join("\n"), 261 - :label => group[0]) 267 + :label => group_caption) 262 268 }.join("\n") 263 269 end 264 270
+44
spec/form_helpers_spec.rb
··· 1 + require_relative "spec_helper.rb" 2 + 3 + class FormHelperTest 4 + include SinatraMore::AssetTagHelpers 5 + include SinatraMore::FormHelpers 6 + include SinatraMore::FormatHelpers 7 + include SinatraMore::OutputHelpers 8 + include SinatraMore::RenderHelpers 9 + include SinatraMore::TagHelpers 10 + include SinatraMore::FormHelpers 11 + end 12 + 13 + describe SinatraMore::FormHelpers do 14 + GROUPED_OPTIONS_A = [ 15 + ['North America', [['United States','US'],'Canada']], 16 + ['Europe', ['Denmark','Germany','France']] 17 + ] 18 + 19 + GROUPED_OPTIONS_H = { 20 + 'North America' => [['United States','US'], 'Canada'], 21 + 'Europe' => ['Denmark','Germany','France'] 22 + } 23 + 24 + OUTPUT = (<<END 25 + <select name="test"><option></option><optgroup label="North America"><option value="US">United States</option> 26 + <option value="Canada">Canada</option></optgroup> 27 + <optgroup label="Europe"><option value="Denmark">Denmark</option> 28 + <option value="Germany">Germany</option> 29 + <option value="France">France</option></optgroup></select> 30 + END 31 + ).strip! 32 + 33 + it "renders a <select> with groups" do 34 + fht = FormHelperTest.new 35 + s = fht.select_tag(:test, :groups => GROUPED_OPTIONS_A, :include_blank => true) 36 + assert_equal s, OUTPUT 37 + end 38 + 39 + it "renders a <select> from a group of arrays" do 40 + fht = FormHelperTest.new 41 + s = fht.select_tag(:test, :groups => GROUPED_OPTIONS_H, :include_blank => true) 42 + assert_equal s, OUTPUT 43 + end 44 + end