Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #9883: add_index_override_to_fields_for_helper_3.diff

File add_index_override_to_fields_for_helper_3.diff, 6.5 kB (added by rmm5t, 1 year ago)

improved tests from the original and fixed doc typo

  • actionpack/test/template/form_helper_test.rb

    old new  
    383383    assert_dom_equal expected, _erbout 
    384384  end 
    385385 
     386  def test_form_for_with_nil_index_option_override 
     387    _erbout = '' 
     388 
     389    form_for("post[]", @post, "index" => nil) do |f| 
     390      _erbout.concat f.text_field(:title) 
     391      _erbout.concat f.text_area(:body) 
     392      _erbout.concat f.check_box(:secret) 
     393    end 
     394 
     395    expected = 
     396      "<form action='http://www.example.com' method='post'>" + 
     397      "<input name='post[][title]' size='30' type='text' id='post__title' value='Hello World' />" + 
     398      "<textarea name='post[][body]' id='post__body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" + 
     399      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />" + 
     400      "<input name='post[][secret]' type='hidden' value='0' />" + 
     401      "</form>" 
     402 
     403    assert_dom_equal expected, _erbout 
     404  end 
     405 
    386406  def test_nested_fields_for 
    387407    _erbout = '' 
    388408    form_for(:post, @post) do |f| 
     
    416436    assert_dom_equal expected, _erbout 
    417437  end 
    418438 
     439  def test_fields_for_with_index 
     440    _erbout = '' 
     441 
     442    fields_for("post[]", @post) do |f| 
     443      _erbout.concat f.text_field(:title) 
     444      _erbout.concat f.text_area(:body) 
     445      _erbout.concat f.check_box(:secret) 
     446    end 
     447 
     448    expected = 
     449      "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" + 
     450      "<textarea name='post[123][body]' id='post_123_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" + 
     451      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />" + 
     452      "<input name='post[123][secret]' type='hidden' value='0' />" 
     453 
     454    assert_dom_equal expected, _erbout 
     455  end 
     456 
     457  def test_fields_for_with_nil_index_option_override 
     458    _erbout = '' 
     459 
     460    fields_for("post[]", @post, :index => nil) do |f| 
     461      _erbout.concat f.text_field(:title) 
     462      _erbout.concat f.text_area(:body) 
     463      _erbout.concat f.check_box(:secret) 
     464    end 
     465 
     466    expected = 
     467      "<input name='post[][title]' size='30' type='text' id='post__title' value='Hello World' />" + 
     468      "<textarea name='post[][body]' id='post__body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" + 
     469      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />" + 
     470      "<input name='post[][secret]' type='hidden' value='0' />" 
     471 
     472    assert_dom_equal expected, _erbout 
     473  end 
     474 
     475  def test_fields_for_with_index_option_override 
     476    _erbout = '' 
     477 
     478    fields_for("post[]", @post, :index => "abc") do |f| 
     479      _erbout.concat f.text_field(:title) 
     480      _erbout.concat f.text_area(:body) 
     481      _erbout.concat f.check_box(:secret) 
     482    end 
     483 
     484    expected = 
     485      "<input name='post[abc][title]' size='30' type='text' id='post_abc_title' value='Hello World' />" + 
     486      "<textarea name='post[abc][body]' id='post_abc_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" + 
     487      "<input name='post[abc][secret]' checked='checked' type='checkbox' id='post_abc_secret' value='1' />" + 
     488      "<input name='post[abc][secret]' type='hidden' value='0' />" 
     489 
     490    assert_dom_equal expected, _erbout 
     491  end 
     492 
    419493  def test_fields_for_without_object 
    420494    _erbout = '' 
    421495    fields_for(:post) do |f| 
  • actionpack/lib/action_view/helpers/form_helper.rb

    old new  
    5757    # 
    5858    #   <input type="text" id="person_1_name" name="person[1][name]" value="<%= @person.name %>" /> 
    5959    # 
     60    # An <tt>index</tt> option may also be passed to <tt>form_for</tt> and <tt>fields_for</tt>.  This automatically applies 
     61    # the <tt>index</tt> to all the nested fields. 
     62    # 
    6063    # There are also methods for helping to build form tags in link:classes/ActionView/Helpers/FormOptionsHelper.html, 
    6164    # link:classes/ActionView/Helpers/DateHelper.html, and link:classes/ActionView/Helpers/ActiveRecordHelper.html 
    6265    module FormHelper 
     
    628631 
    629632      def initialize(object_name, object, template, options, proc) 
    630633        @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc 
     634        @default_options = @options.with_indifferent_access.slice(:index) 
    631635      end 
    632636 
    633637      (field_helpers - %w(label check_box radio_button fields_for)).each do |selector| 
    634638        src = <<-end_src 
    635639          def #{selector}(method, options = {}) 
    636             @template.send(#{selector.inspect}, @object_name, method, options.merge(:object => @object)) 
     640            @template.send(#{selector.inspect}, @object_name, method, objectify_options(options)) 
    637641          end 
    638642        end_src 
    639643        class_eval src, __FILE__, __LINE__ 
     
    657661      end 
    658662 
    659663      def label(method, text = nil, options = {}) 
    660         @template.label(@object_name, method, text, options.merge(:object => @object)) 
     664        @template.label(@object_name, method, text, objectify_options(options)) 
    661665      end 
    662666 
    663667      def check_box(method, options = {}, checked_value = "1", unchecked_value = "0") 
    664         @template.check_box(@object_name, method, options.merge(:object => @object), checked_value, unchecked_value) 
     668        @template.check_box(@object_name, method, objectify_options(options), checked_value, unchecked_value) 
    665669      end 
    666670 
    667671      def radio_button(method, tag_value, options = {}) 
    668         @template.radio_button(@object_name, method, tag_value, options.merge(:object => @object)) 
     672        @template.radio_button(@object_name, method, tag_value, objectify_options(options)) 
    669673      end 
    670674 
    671675      def error_message_on(method, prepend_text = "", append_text = "", css_class = "formError") 
     
    673677      end 
    674678 
    675679      def error_messages(options = {}) 
    676         @template.error_messages_for(@object_name, options.merge(:object => @object)) 
     680        @template.error_messages_for(@object_name, objectify_options(options)) 
    677681      end 
    678682 
    679683      def submit(value = "Save changes", options = {}) 
    680684        @template.submit_tag(value, options.reverse_merge(:id => "#{object_name}_submit")) 
    681685      end 
     686 
     687      private 
     688 
     689      def objectify_options(options) 
     690        @default_options.merge(options.merge(:object => @object)) 
     691      end 
    682692    end 
    683693  end 
    684694