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

Ticket #9883: add_index_override_to_fields_for_helper.diff

File add_index_override_to_fields_for_helper.diff, 6.0 kB (added by rmm5t, 1 year ago)

Allow "index" option to be passed to fields_for helper. Tests and rdoc included.

  • actionpack/test/template/form_helper_test.rb

    old new  
    369369    assert_dom_equal expected, _erbout 
    370370  end 
    371371 
     372  def test_form_for_with_index_option_override 
     373    _erbout = '' 
     374 
     375    form_for("post[]", @post, "index" => nil) do |f| 
     376      _erbout.concat f.text_field(:title) 
     377      _erbout.concat f.text_area(:body) 
     378      _erbout.concat f.check_box(:secret) 
     379    end 
     380 
     381    expected = 
     382      "<form action='http://www.example.com' method='post'>" + 
     383      "<input name='post[][title]' size='30' type='text' id='post__title' value='Hello World' />" + 
     384      "<textarea name='post[][body]' id='post__body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" + 
     385      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />" + 
     386      "<input name='post[][secret]' type='hidden' value='0' />" + 
     387      "</form>" 
     388 
     389    assert_dom_equal expected, _erbout 
     390  end 
     391 
    372392  def test_nested_fields_for 
    373393    _erbout = '' 
    374394    form_for(:post, @post) do |f| 
     
    402422    assert_dom_equal expected, _erbout 
    403423  end 
    404424 
     425  def test_fields_for_with_index 
     426    _erbout = '' 
     427 
     428    fields_for("post[]", @post) do |f| 
     429      _erbout.concat f.text_field(:title) 
     430      _erbout.concat f.text_area(:body) 
     431      _erbout.concat f.check_box(:secret) 
     432    end 
     433 
     434    expected = 
     435      "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" + 
     436      "<textarea name='post[123][body]' id='post_123_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" + 
     437      "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />" + 
     438      "<input name='post[123][secret]' type='hidden' value='0' />" 
     439 
     440    assert_dom_equal expected, _erbout 
     441  end 
     442 
     443  def test_fields_for_with_index_option_override 
     444    _erbout = '' 
     445 
     446    fields_for("post[]", @post, :index => nil) do |f| 
     447      _erbout.concat f.text_field(:title) 
     448      _erbout.concat f.text_area(:body) 
     449      _erbout.concat f.check_box(:secret) 
     450    end 
     451 
     452    expected = 
     453      "<input name='post[][title]' size='30' type='text' id='post__title' value='Hello World' />" + 
     454      "<textarea name='post[][body]' id='post__body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" + 
     455      "<input name='post[][secret]' checked='checked' type='checkbox' id='post__secret' value='1' />" + 
     456      "<input name='post[][secret]' type='hidden' value='0' />" 
     457 
     458    assert_dom_equal expected, _erbout 
     459  end 
     460 
    405461  def test_fields_for_without_object 
    406462    _erbout = '' 
    407463    fields_for(:post) do |f| 
  • actionpack/lib/action_view/helpers/form_helper.rb

    old new  
    5858    # 
    5959    #   <input type="text" id="person_1_name" name="person[1][name]" value="<%= @person.name %>" /> 
    6060    # 
     61    # An <tt>index</tt> options may also be passed to <tt>form_for</tt> and <tt>fields_for</tt>.  This automatically applies 
     62    # the <tt>index</tt> to all the nested fields. 
     63    # 
    6164    # There are also methods for helping to build form tags in link:classes/ActionView/Helpers/FormOptionsHelper.html, 
    6265    # link:classes/ActionView/Helpers/DateHelper.html, and link:classes/ActionView/Helpers/ActiveRecordHelper.html 
    6366    module FormHelper 
     
    604607      attr_accessor :object_name, :object, :options 
    605608 
    606609      def initialize(object_name, object, template, options, proc) 
    607         @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc         
     610        @object_name, @object, @template, @options, @proc = object_name, object, template, options, proc 
     611        @default_options = @options.with_indifferent_access.slice(:index) 
    608612      end 
    609613       
    610614      (field_helpers - %w(label check_box radio_button fields_for)).each do |selector| 
    611615        src = <<-end_src 
    612616          def #{selector}(method, options = {}) 
    613             @template.send(#{selector.inspect}, @object_name, method, options.merge(:object => @object)) 
     617            @template.send(#{selector.inspect}, @object_name, method, objectify_options(options)) 
    614618          end 
    615619        end_src 
    616620        class_eval src, __FILE__, __LINE__ 
     
    622626      end 
    623627 
    624628      def label(method, text = nil, options = {}) 
    625         @template.label(@object_name, method, text, options.merge(:object => @object)) 
     629        @template.label(@object_name, method, text, objectify_options(options)) 
    626630      end 
    627631 
    628632      def check_box(method, options = {}, checked_value = "1", unchecked_value = "0") 
    629         @template.check_box(@object_name, method, options.merge(:object => @object), checked_value, unchecked_value) 
     633        @template.check_box(@object_name, method, objectify_options(options), checked_value, unchecked_value) 
    630634      end 
    631635       
    632636      def radio_button(method, tag_value, options = {}) 
    633         @template.radio_button(@object_name, method, tag_value, options.merge(:object => @object)) 
     637        @template.radio_button(@object_name, method, tag_value, objectify_options(options)) 
    634638      end 
    635639       
    636640      def error_message_on(method, prepend_text = "", append_text = "", css_class = "formError") 
     
    638642      end       
    639643 
    640644      def error_messages(options = {}) 
    641         @template.error_messages_for(@object_name, options.merge(:object => @object)) 
     645        @template.error_messages_for(@object_name, objectify_options(options)) 
    642646      end 
    643647       
    644648      def submit(value = "Save changes", options = {}) 
    645649        @template.submit_tag(value, options.reverse_merge(:id => "#{object_name}_submit")) 
    646650      end 
     651 
     652      private 
     653 
     654      def objectify_options(options) 
     655        @default_options.merge(options.merge(:object => @object)) 
     656      end 
    647657    end 
    648658  end 
    649659