Changeset 847

Show
Ignore:
Timestamp:
11/05/07 14:47:13 (1 year ago)
Author:
iv..@gweezlebur.com
Message:

url() can now generate recursively nested query strings (Closes #265) Thanks pythonic

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/merb/mixins/controller.rb

    r844 r847  
    6868          url_from_route(route, new_params) 
    6969        elsif route_name.nil? 
    70           request.path + (new_params.empty? ? "" : "?" + new_params.to_params
     70          request.path + (new_params.empty? ? "" : "?" + params_to_query_string(new_params)
    7171        elsif route_name.is_a?(Symbol) 
    7272          url_from_route(route_name, new_params) 
    7373        elsif route_name.is_a?(String) 
    74           route_name + (new_params.empty? ? "" : "?" + new_params.to_params
     74          route_name + (new_params.empty? ? "" : "?" + params_to_query_string(new_params)
    7575        else 
    7676          raise "URL not generated: #{route_name.inspect}, #{new_params.inspect}" 
     
    9191        end 
    9292        extras = new_params.reject{ |k, v| keys.include?(k) } 
    93         path += "?" + extras.to_params unless extras.empty? 
     93        path += "?" + params_to_query_string(extras) unless extras.empty? 
    9494      end 
    9595      path 
     
    117117      end 
    118118      unless query_params.empty? 
    119         url += "?" 
    120         query_params.each { |k,v| 
    121           if v.is_a?(Array) 
    122             v.each {|e| 
    123               url += "#{k}[]=#{e}&" 
    124             } 
    125           elsif v.is_a?(Hash) 
    126             v.each {|ek, ev| 
    127               url += "#{k}[#{ek}]=#{ev}&" 
    128             } 
    129           else 
    130             url += "#{k}=#{v}&" 
    131           end 
    132         } 
    133       end 
    134       url.sub(/\&$/,'') 
     119        url += "?" + params_to_query_string(query_params) 
     120      end 
     121      url 
    135122    end 
    136123 
    137124    protected 
     125 
     126    # Creates query string from params, supporting nested arrays and hashes. 
     127    # ==== Example 
     128    #   params_to_query_string(:user => {:filter => {:name => "quux*"}, :order => ["name"]}) 
     129    #   # => user[filter][name]=quux*&user[order][]=name 
     130    def params_to_query_string(value, key = nil) 
     131      case value 
     132      when Array 
     133        value.map { |v| 
     134          params_to_query_string(v, "#{key}[]") 
     135        } * "&" 
     136      when Hash 
     137        value.map { |k, v| 
     138          params_to_query_string(v, key ? "#{key}[#{k}]" : k) 
     139        } * "&" 
     140      else 
     141        "#{key}=#{value}" 
     142      end 
     143    end 
    138144     
    139145    # +format_extension+ dictates when named route urls generated by #url 
  • trunk/spec/merb/controller_spec.rb

    r843 r847  
    103103  end 
    104104   
    105   it "should handle nested nested and more nested hashes and arrays" 
    106  
     105  it "should handle nested nested and more nested hashes and arrays" do 
     106    c = new_url_controller(@default_route, :controller => "foo", :action => "bar") 
     107    url = c.url(:controller => :current, :user => {:filter => {:name => "quux*"}, :order => ["name"]}) 
     108    url.should match(%r{/foo/bar?.*user\[filter\]\[name\]=quux\*}) 
     109    url.should match(%r{/foo/bar?.*user\[order\]\[\]=name}) 
     110  end 
    107111end