Changeset 847
- Timestamp:
- 11/05/07 14:47:13 (1 year ago)
- Files:
-
- trunk/lib/merb/mixins/controller.rb (modified) (3 diffs)
- trunk/spec/merb/controller_spec.rb (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/merb/mixins/controller.rb
r844 r847 68 68 url_from_route(route, new_params) 69 69 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)) 71 71 elsif route_name.is_a?(Symbol) 72 72 url_from_route(route_name, new_params) 73 73 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)) 75 75 else 76 76 raise "URL not generated: #{route_name.inspect}, #{new_params.inspect}" … … 91 91 end 92 92 extras = new_params.reject{ |k, v| keys.include?(k) } 93 path += "?" + extras.to_paramsunless extras.empty?93 path += "?" + params_to_query_string(extras) unless extras.empty? 94 94 end 95 95 path … … 117 117 end 118 118 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 135 122 end 136 123 137 124 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 138 144 139 145 # +format_extension+ dictates when named route urls generated by #url trunk/spec/merb/controller_spec.rb
r843 r847 103 103 end 104 104 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 107 111 end
