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

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  
    7272 
    7373  def test_label 
    7474    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")) 
    7577    assert_dom_equal('<label for="post_title">The title goes here</label>', label("post", "title", "The title goes here")) 
    7678    assert_dom_equal( 
    7779      '<label class="title_label" for="post_title">Title</label>', 
     
    262264                 check_box("post", "secret", :id => "i mean it") 
    263265  end 
    264266 
     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 
    265309  def test_auto_index 
    266310    pid = @post.id 
    267311    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( 
    268318      "<input id=\"post_#{pid}_title\" name=\"post[#{pid}][title]\" size=\"30\" type=\"text\" value=\"Hello World\" />", text_field("post[]","title") 
    269319    ) 
    270320    assert_dom_equal( 
     
    353403    _erbout = '' 
    354404     
    355405    form_for("post[]", @post) do |f| 
     406      _erbout.concat f.label(:title) 
    356407      _erbout.concat f.text_field(:title) 
    357408      _erbout.concat f.text_area(:body) 
    358409      _erbout.concat f.check_box(:secret) 
     
    360411     
    361412    expected =  
    362413      "<form action='http://www.example.com' method='post'>" + 
     414      "<label for='post_123_title'>Title</label>" + 
    363415      "<input name='post[123][title]' size='30' type='text' id='post_123_title' value='Hello World' />" + 
    364416      "<textarea name='post[123][body]' id='post_123_body' rows='20' cols='40'>Back to the hill and over it again!</textarea>" + 
    365417      "<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  
    230230      # it explicitly. Additional options on the label tag can be passed as a hash with +options+. These options will be tagged 
    231231      # onto the html as an HTML element attribute as in the example shown. 
    232232      # 
     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      # 
    233236      # ==== Examples 
    234237      #   label(:post, :title) 
    235238      #   #=> <label for="post_title">Title</label> 
     
    240243      #   label(:post, :title, "A short title", :class => "title_label") 
    241244      #   #=> <label for="post_title" class="title_label">A short title</label> 
    242245      # 
     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      # 
    243258      def label(object_name, method, text = nil, options = {}) 
    244259        InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_label_tag(text, options) 
    245260      end 
     
    395410      #   radio_button("user", "receive_newsletter", "no") 
    396411      #   # => <input type="radio" id="user_receive_newsletter" name="user[receive_newsletter]" value="yes" /> 
    397412      #   #    <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      # 
    398444      def radio_button(object_name, method, tag_value, options = {}) 
    399445        InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_radio_button_tag(tag_value, options) 
    400446      end 
     
    424470      end 
    425471 
    426472      def to_label_tag(text = nil, options = {}) 
     473        options = options.stringify_keys 
    427474        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 
    430496        content = (text.blank? ? nil : text.to_s) || method_name.humanize 
    431497        content_tag("label", content, options) 
    432498      end 
     
    455521          checked = self.class.radio_button_checked?(value(object), tag_value) 
    456522        end 
    457523        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 
    462532        add_default_name_and_id(options) 
    463533        tag("input", options) 
    464534      end 
     
    594664        def sanitized_object_name 
    595665          @object_name.gsub(/[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "") 
    596666        end 
     667 
     668        def sanitized_tag_value(tag_value) 
     669          tag_value.to_s.gsub(/\s/, "_").gsub(/\W/, "").downcase 
     670        end 
    597671    end 
    598672 
    599673    class FormBuilder #:nodoc: