From 9accd2600dfeb1595ec9f8ec2046ca308dfca90b Mon Sep 17 00:00:00 2001 From: Ismael Celis Date: Wed, 31 Aug 2011 12:21:13 +0100 Subject: [PATCH] Rails style nested params with arrays * ie. note[item_ids][]=1¬e[item_ids][]=2 --- src/davis.request.js | 15 +++++++++++---- tests/test_request.js | 12 ++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/davis.request.js b/src/davis.request.js index dbd8b32..aa6974c 100644 --- a/src/davis.request.js +++ b/src/davis.request.js @@ -38,15 +38,22 @@ Davis.Request = function (raw) { Davis.utils.forEach(this.queryString.split("&"), function (keyval) { var paramName = keyval.split("=")[0], paramValue = keyval.split("=")[1], - nestedParamRegex = /^(\w+)\[(\w+)\]/, + nestedParamRegex = /^(\w+)\[(\w+)\](\[\])?/, nested; - if (nested = nestedParamRegex.exec(paramName)) { var paramParent = nested[1]; var paramName = nested[2]; + var isArray = nested[3]; var parentParams = self.params[paramParent] || {}; - parentParams[paramName] = paramValue; - self.params[paramParent] = parentParams; + + if(isArray != undefined) { + parentParams[paramName] = parentParams[paramName] || []; + parentParams[paramName].push(paramValue); + self.params[paramParent] = parentParams; + }else { + parentParams[paramName] = paramValue; + self.params[paramParent] = parentParams; + } } else { self.params[paramName] = paramValue; }; diff --git a/tests/test_request.js b/tests/test_request.js index 81d414f..a45c860 100644 --- a/tests/test_request.js +++ b/tests/test_request.js @@ -51,6 +51,18 @@ test("parsing rails style nested params", function () { }}, request.params, "should combine the nested params into a separate object under params") }) +test("parsing rails style nested params with arrays", function () { + var request = factory('request', { + fullPath: '/foo?note[ids][]=123¬e[ids][]=asdf¬e[bars][]=1¬e[bars][]=2¬e[li]=li' + }) + + same({note: { + ids: ['123','asdf'], + bars: ['1', '2'], + li: 'li' + }}, request.params, "should combine the nested params into a single array") +}) + test("generating a request for the initial page load", function () { var request = Davis.Request.forPageLoad()