Ticket #9915: make_index_consistent_with_radio_buttons_and_labels.diff
| File make_index_consistent_with_radio_buttons_and_labels.diff, 10.9 kB (added by zilkey, 11 months ago) |
|---|
-
actionpack/test/template/form_helper_test.rb
old new 72 72 73 73 def test_label 74 74 assert_dom_equal('<label for="post_title">Title</label>', label("post", "title")) 75 assert_dom_equal('<label for="post_title_value">Title</label>', label("post", "title",nil,"radio_button_value"=>"value")) 76 assert_dom_equal(label("post", "title",nil,:radio_button_value=>"value"), label("post", "title",nil,"radio_button_value"=>"value")) 75 77 assert_dom_equal('<label for="post_title">The title goes here</label>', label("post", "title", "The title goes here")) 76 78 assert_dom_equal( 77 79 '<label class="title_label" for="post_title">Title</label>', … … 262 264 check_box("post", "secret", :id => "i mean it") 263 265 end 264 266 267 def test_index 268 pid = @post.id 269 index = "INDEX" 270 assert_dom_equal( 271 "<label for=\"post_#{index}_title\">Title</label>", label("post[]","title", nil, "index" => index) 272 ) 273 assert_dom_equal( 274 "<label for=\"post_#{index}_title_goodbye_world\">Title</label>", label("post","title",nil,"index"=>index, "radio_button_value"=>"goodbye_world") 275 ) 276 assert_dom_equal( 277 "<input id=\"post_#{index}_title\" name=\"post[#{index}][title]\" size=\"30\" type=\"text\" value=\"Hello World\" />", text_field("post","title", "index"=>index) 278 ) 279 assert_dom_equal( 280 "<textarea cols=\"40\" id=\"post_#{index}_body\" name=\"post[#{index}][body]\" rows=\"20\">Back to the hill and over it again!</textarea>", 281 text_area("post", "body", "index"=>index) 282 ) 283 assert_dom_equal( 284 "<input checked=\"checked\" id=\"post_#{index}_secret\" name=\"post[#{index}][secret]\" type=\"checkbox\" value=\"1\" /><input name=\"post[#{index}][secret]\" type=\"hidden\" value=\"0\" />", 285 check_box("post", "secret","index"=>index) 286 ) 287 assert_dom_equal( 288 "<input checked=\"checked\" id=\"post_#{index}_title_hello_world\" name=\"post[#{index}][title]\" type=\"radio\" value=\"Hello World\" />", 289 radio_button("post", "title", "Hello World","index"=>index) 290 ) 291 assert_dom_equal("<input id=\"post_#{index}_title_goodbye_world\" name=\"post[#{index}][title]\" type=\"radio\" value=\"Goodbye World\" />", 292 radio_button("post", "title", "Goodbye World","index"=>index) 293 ) 294 295 assert_equal label("post","title",nil,"index"=>"dont guess"), 296 label("post","title",nil,:index=>"dont guess") 297 assert_equal label("post","title",nil,"index"=>"dont guess","radio_button_value"=>"add"), 298 label("post","title",nil,:index=>"dont guess",:radio_button_value=>"add") 299 assert_dom_equal text_field("post", "title", "index" => "dont guess"), 300 text_field("post", "title", :index => "dont guess") 301 assert_dom_equal text_area("post", "body", "index" => "really!"), 302 text_area("post", "body", :index => "really!") 303 assert_dom_equal check_box("post", "secret", "index" => "i mean it"), 304 check_box("post", "secret", :index => "i mean it") 305 306 end 307 308 265 309 def test_auto_index 266 310 pid = @post.id 267 311 assert_dom_equal( 312 "<label for=\"post_#{pid}_title\">Title</label>", label("post[]","title") 313 ) 314 assert_dom_equal( 315 "<label for=\"post_#{pid}_title_goodbye_world\">Title</label>", label("post[]","title",nil,"radio_button_value"=>"goodbye_world") 316 ) 317 assert_dom_equal( 268 318 "<input id=\"post_#{pid}_title\" name=\"post[#{pid}][title]\" size=\"30\" type=\"text\" value=\"Hello World\" />", text_field("post[]","title") 269 319 ) 270 320 assert_dom_equal( … … 353 403 _erbout = '' 354 404 355 405 form_for("post[]", @post) do |f| 406 _erbout.concat f.label(:title) 356 407 _erbout.concat f.text_field(:title) 357 408 _erbout.concat f.text_area(:body) 358 409 _erbout.concat f.check_box(:secret) … … 360 411 361 412 expected = 362 413 "<form action='http://www.example.com' method='post'>" + 414 "<label for='post_123_title'>Title</label>" + 363 415 "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" + 364 416 "<textarea name='post[123][body]' id='post_123_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" + 365 417 "<input name='post[123][secret]' checked='checked' type='checkbox' id='post_123_secret' value='1' />" + -
actionpack/lib/action_view/helpers/form_helper.rb
old new 230 230 # it explicitly. Additional options on the label tag can be passed as a hash with +options+. These options will be tagged 231 231 # onto the html as an HTML element attribute as in the example shown. 232 232 # 233 # Passing a <tt>:radio_button_value</tt> appends +radio_button_value+ to the end of the "for" attribute so that labels can 234 # correctly identify radio buttons. 235 # 233 236 # ==== Examples 234 237 # label(:post, :title) 235 238 # #=> <label for="post_title">Title</label> … … 240 243 # label(:post, :title, "A short title", :class => "title_label") 241 244 # #=> <label for="post_title" class="title_label">A short title</label> 242 245 # 246 # label("post[]", :title, "A short title") 247 # #=> <label for="post_<%= @post.id %>_title">A short title</label> 248 # 249 # label(:post, :title, "A short title", :index => 1) 250 # #=> <label for="post_1_title">A short title</label> 251 # 252 # label("post[]", :title, "A short title", :radio_button_value => "rails") 253 # #=> <label for="post_<%= @post.id %>_title_rails">A short title</label> 254 # 255 # label(:post, :title, "A short title", :index => 1, :radio_button_value => "rails") 256 # #=> <label for="post_1_title_rails">A short title</label> 257 # 243 258 def label(object_name, method, text = nil, options = {}) 244 259 InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_label_tag(text, options) 245 260 end … … 395 410 # radio_button("user", "receive_newsletter", "no") 396 411 # # => <input type="radio" id="user_receive_newsletter" name="user[receive_newsletter]" value="yes" /> 397 412 # # <input type="radio" id="user_receive_newsletter" name="user[receive_newsletter]" value="no" checked="checked" /> 413 # 414 # # Let's say that @posts has 2 posts, 1 with the category "rails", the other with the category "java" 415 # <%- @posts.each do |post| -%> 416 # <%- @post = post -%> 417 # <p> 418 # <%= radio_button("post[]", "category", "rails") %> 419 # <%= radio_button("post[]", "category", "java") %> 420 # </p> 421 # <%- end -%> 422 # # => <p> 423 # # <input type="radio" id="post_1_category" name="post[1][category]" value="rails" checked="checked" /> 424 # # <input type="radio" id="post_1_category" name="post[1][category]" value="java" /> 425 # # </p> 426 # # <p> 427 # # <input type="radio" id="post_1_category" name="post[2][category]" value="rails"/> 428 # # <input type="radio" id="post_1_category" name="post[2][category]" value="java" checked="checked" /> 429 # # </p> 430 # 431 # <%- @posts.each do |post| -%> 432 # <%= radio_button("post", "category", "rails", :index=>post.id) %> 433 # <%= radio_button("post", "category", "java", :index=>post.id) %> 434 # <%- end -%> 435 # # => <p> 436 # # <input type="radio" id="post_1_category" name="post[1][category]" value="rails" checked="checked" /> 437 # # <input type="radio" id="post_1_category" name="post[1][category]" value="java" /> 438 # # </p> 439 # # <p> 440 # # <input type="radio" id="post_1_category" name="post[2][category]" value="rails"/> 441 # # <input type="radio" id="post_1_category" name="post[2][category]" value="java" checked="checked" /> 442 # # </p> 443 # 398 444 def radio_button(object_name, method, tag_value, options = {}) 399 445 InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_radio_button_tag(tag_value, options) 400 446 end … … 424 470 end 425 471 426 472 def to_label_tag(text = nil, options = {}) 473 options = options.stringify_keys 427 474 name_and_id = options.dup 428 add_default_name_and_id(name_and_id) 429 options["for"] = name_and_id["id"] 475 add_default_name_and_id(name_and_id) 476 if options.has_key?("radio_button_value") 477 pretty_tag_value = sanitized_tag_value(options.delete("radio_button_value")) 478 if options.has_key?("index") 479 options["for"] ||= "#{@object_name}_#{options["index"]}_#{@method_name}_#{pretty_tag_value}" 480 options.delete("index") 481 elsif defined?(@auto_index) 482 options["for"] ||= "#{@object_name}_#{@auto_index}_#{@method_name}_#{pretty_tag_value}" 483 else 484 options["for"] ||= "#{@object_name}_#{@method_name}_#{pretty_tag_value}" 485 end 486 else 487 if options.has_key?("index") 488 options["for"] ||= tag_id_with_index(options["index"]) 489 options.delete("index") 490 elsif defined?(@auto_index) 491 options["for"] ||= tag_id_with_index(@auto_index) 492 else 493 options["for"] ||= name_and_id["id"] 494 end 495 end 430 496 content = (text.blank? ? nil : text.to_s) || method_name.humanize 431 497 content_tag("label", content, options) 432 498 end … … 455 521 checked = self.class.radio_button_checked?(value(object), tag_value) 456 522 end 457 523 options["checked"] = "checked" if checked 458 pretty_tag_value = tag_value.to_s.gsub(/\s/, "_").gsub(/\W/, "").downcase 459 options["id"] ||= defined?(@auto_index) ? 460 "#{@object_name}_#{@auto_index}_#{@method_name}_#{pretty_tag_value}" : 461 "#{@object_name}_#{@method_name}_#{pretty_tag_value}" 524 pretty_tag_value = sanitized_tag_value(tag_value) 525 if options.has_key?("index") 526 options["id"] ||= "#{@object_name}_#{options["index"]}_#{@method_name}_#{pretty_tag_value}" 527 elsif defined?(@auto_index) 528 options["id"] ||= "#{@object_name}_#{@auto_index}_#{@method_name}_#{pretty_tag_value}" 529 else 530 options["id"] ||= "#{@object_name}_#{@method_name}_#{pretty_tag_value}" 531 end 462 532 add_default_name_and_id(options) 463 533 tag("input", options) 464 534 end … … 594 664 def sanitized_object_name 595 665 @object_name.gsub(/[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "") 596 666 end 667 668 def sanitized_tag_value(tag_value) 669 tag_value.to_s.gsub(/\s/, "_").gsub(/\W/, "").downcase 670 end 597 671 end 598 672 599 673 class FormBuilder #:nodoc: