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) |
|---|
-
actionpack/test/template/form_helper_test.rb
old new 369 369 assert_dom_equal expected, _erbout 370 370 end 371 371 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 372 392 def test_nested_fields_for 373 393 _erbout = '' 374 394 form_for(:post, @post) do |f| … … 402 422 assert_dom_equal expected, _erbout 403 423 end 404 424 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 405 461 def test_fields_for_without_object 406 462 _erbout = '' 407 463 fields_for(:post) do |f| -
actionpack/lib/action_view/helpers/form_helper.rb
old new 58 58 # 59 59 # <input type="text" id="person_1_name" name="person[1][name]" value="<%= @person.name %>" /> 60 60 # 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 # 61 64 # There are also methods for helping to build form tags in link:classes/ActionView/Helpers/FormOptionsHelper.html, 62 65 # link:classes/ActionView/Helpers/DateHelper.html, and link:classes/ActionView/Helpers/ActiveRecordHelper.html 63 66 module FormHelper … … 604 607 attr_accessor :object_name, :object, :options 605 608 606 609 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) 608 612 end 609 613 610 614 (field_helpers - %w(label check_box radio_button fields_for)).each do |selector| 611 615 src = <<-end_src 612 616 def #{selector}(method, options = {}) 613 @template.send(#{selector.inspect}, @object_name, method, o ptions.merge(:object => @object))617 @template.send(#{selector.inspect}, @object_name, method, objectify_options(options)) 614 618 end 615 619 end_src 616 620 class_eval src, __FILE__, __LINE__ … … 622 626 end 623 627 624 628 def label(method, text = nil, options = {}) 625 @template.label(@object_name, method, text, o ptions.merge(:object => @object))629 @template.label(@object_name, method, text, objectify_options(options)) 626 630 end 627 631 628 632 def check_box(method, options = {}, checked_value = "1", unchecked_value = "0") 629 @template.check_box(@object_name, method, o ptions.merge(:object => @object), checked_value, unchecked_value)633 @template.check_box(@object_name, method, objectify_options(options), checked_value, unchecked_value) 630 634 end 631 635 632 636 def radio_button(method, tag_value, options = {}) 633 @template.radio_button(@object_name, method, tag_value, o ptions.merge(:object => @object))637 @template.radio_button(@object_name, method, tag_value, objectify_options(options)) 634 638 end 635 639 636 640 def error_message_on(method, prepend_text = "", append_text = "", css_class = "formError") … … 638 642 end 639 643 640 644 def error_messages(options = {}) 641 @template.error_messages_for(@object_name, o ptions.merge(:object => @object))645 @template.error_messages_for(@object_name, objectify_options(options)) 642 646 end 643 647 644 648 def submit(value = "Save changes", options = {}) 645 649 @template.submit_tag(value, options.reverse_merge(:id => "#{object_name}_submit")) 646 650 end 651 652 private 653 654 def objectify_options(options) 655 @default_options.merge(options.merge(:object => @object)) 656 end 647 657 end 648 658 end 649 659