<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -59,9 +59,7 @@ Ajax.Base = Class.create({
 
     this.options.method = this.options.method.toLowerCase();
 
-    if (Object.isString(this.options.parameters))
-      this.options.parameters = this.options.parameters.toQueryParams();
-    else if (Object.isHash(this.options.parameters))
+    if (Object.isHash(this.options.parameters))
       this.options.parameters = this.options.parameters.toObject();
   }
 });
@@ -78,17 +76,22 @@ Ajax.Request = Class.create(Ajax.Base, {
   request: function(url) {
     this.url = url;
     this.method = this.options.method;
-    var params = Object.clone(this.options.parameters);
+    var params = this.options.parameters;
+    if (!Object.isString(params)) params = Object.clone(params);
 
     if (!['get', 'post'].include(this.method)) {
       // simulate other verbs over post
-      params['_method'] = this.method;
+      if(Object.isString(params))
+        params += '_method=' + this.method;
+      else
+        params['_method'] = this.method;
       this.method = 'post';
     }
 
     this.parameters = params;
 
-    if (params = Object.toQueryString(params)) {
+    if (!Object.isString(params)) params = Object.toQueryString(params);
+    if (params) {
       // when GET, append parameters to URL
       if (this.method == 'get')
         this.url += (this.url.include('?') ? '&amp;' : '?') + params;</diff>
      <filename>src/ajax.js</filename>
    </modified>
    <modified>
      <diff>@@ -11,7 +11,8 @@ var Form = {
     var key, value, type, isImageType, isSubmitButton, submitSerialized;
     var submit = options.submit;
     
-    var data = elements.inject({ }, function(result, element) {
+    var start_with = options.hash ? { } : ''
+    var data = elements.inject(start_with, function(result, element) {
       element = $(element);
       key     = element.name;
       value   = element.getValue();
@@ -38,22 +39,37 @@ var Form = {
           var prefix = key ? key + '.' : '',
            x = options.x || 0, y = options.y || 0;
            
-          result[prefix + 'x'] = x;
-          result[prefix + 'y'] = y;
+          if (Object.isString(result)) {
+            if (result != '') result += '&amp;';
+            var pairs = { }
+            pairs[prefix + 'x'] = x;
+            pairs[prefix + 'y'] = y;
+            result += Object.toQueryString(pairs);
+          }
+          else {
+            result[prefix + 'x'] = x;
+            result[prefix + 'y'] = y;
+          }
           return result;
         }
       } else if (!key) return result;
       
-      if (key in result) {
-        // a key is already present; construct an array of values
-        if (!Object.isArray(result[key])) result[key] = [result[key]];
-        result[key].push(value);
-      } else result[key] = value;
+      if (Object.isString(result)) {
+        if (result != '') result += '&amp;';
+        result += element.serialize();
+      }
+      else {
+        if (key in result) {
+          // a key is already present; construct an array of values
+          if (!Object.isArray(result[key])) result[key] = [result[key]];
+          result[key].push(value);
+        } else result[key] = value;
+      }
       
       return result;
     });
     
-    return options.hash ? data : Object.toQueryString(data);
+    return data;
   }
 };
 </diff>
      <filename>src/form.js</filename>
    </modified>
    <modified>
      <diff>@@ -99,6 +99,14 @@
   &lt;input type=&quot;file&quot; name=&quot;file_name&quot; value=&quot;foo&quot; /&gt;
 &lt;/form&gt;
 
+&lt;form id=&quot;form_with_rails_style_nested_params&quot;&gt;
+  &lt;input type=&quot;text&quot; name=&quot;group[name]&quot; value=&quot;a&quot; /&gt;
+  &lt;input type=&quot;text&quot; name=&quot;group[person][][first_name]&quot; value=&quot;b&quot; /&gt;
+  &lt;input type=&quot;text&quot; name=&quot;group[person][][last_name]&quot;  value=&quot;c&quot; /&gt;
+  &lt;input type=&quot;text&quot; name=&quot;group[person][][first_name]&quot; value=&quot;d&quot; /&gt;
+  &lt;input type=&quot;text&quot; name=&quot;group[person][][last_name]&quot;  value=&quot;e&quot; /&gt;
+&lt;/form&gt;
+
 &lt;!-- tabindexed forms --&gt;
 &lt;div id=&quot;tabindex&quot;&gt;
   &lt;form id=&quot;ffe&quot;&gt;</diff>
      <filename>test/unit/fixtures/form.html</filename>
    </modified>
    <modified>
      <diff>@@ -286,6 +286,11 @@ new Test.Unit.Runner({
     // test control groups
     var expected = {group_radio:'2r', group_checkbox:'2c'};
     this.assertHashEqual(expected, Form.serialize('form_with_control_groups', {submit:'button_commit'}));
+    
+    // forms with Rails style nested params should serialize in the right order
+    var form = $('form_with_rails_style_nested_params');
+    var expected = 'group[name]=a&amp;group[person][][first_name]=b&amp;group[person][][last_name]=c&amp;group[person][][first_name]=d&amp;group[person][][last_name]=e'
+    this.assertEqual(expected, unescape(form.serialize()))
   },
   
   testFormMethodsOnExtendedElements: function() {</diff>
      <filename>test/unit/form_test.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a134431d807463274176f6db457a2001e9b7e3a4</id>
    </parent>
  </parents>
  <author>
    <name>Pete Yandell</name>
    <email>pete@notahat.com</email>
  </author>
  <url>http://github.com/notahat/prototype/commit/8949aa23cb547039a34f380863e13c11bc919878</url>
  <id>8949aa23cb547039a34f380863e13c11bc919878</id>
  <committed-date>2008-07-12T00:45:53-07:00</committed-date>
  <authored-date>2008-07-12T00:45:53-07:00</authored-date>
  <message>Patched to serialize Rails style forms with nested params in the correct order.</message>
  <tree>129e310db4fc29e0a975bcfae5320a2c160f0833</tree>
  <committer>
    <name>Pete Yandell</name>
    <email>pete@notahat.com</email>
  </committer>
</commit>
