aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ngResource/resource.js14
-rw-r--r--test/ngResource/resourceSpec.js27
2 files changed, 35 insertions, 6 deletions
diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js
index 166fc9b8..cd03d2d2 100644
--- a/src/ngResource/resource.js
+++ b/src/ngResource/resource.js
@@ -280,12 +280,17 @@ angular.module('ngResource', ['ng']).
url: function(params) {
var self = this,
url = this.template,
+ val,
encodedVal;
params = params || {};
forEach(this.urlParams, function(_, urlParam){
- encodedVal = encodeUriSegment(params[urlParam] || self.defaults[urlParam] || "");
- url = url.replace(new RegExp(":" + urlParam + "(\\W)"), encodedVal + "$1");
+ if (val = (params[urlParam] || self.defaults[urlParam])) {
+ encodedVal = encodeUriSegment(val);
+ url = url.replace(new RegExp(":" + urlParam + "(\\W)", "g"), encodedVal + "$1");
+ } else {
+ url = url.replace(new RegExp("/?:" + urlParam + "(\\W)", "g"), '$1');
+ }
});
url = url.replace(/\/?#$/, '');
var query = [];
@@ -306,8 +311,9 @@ angular.module('ngResource', ['ng']).
actions = extend({}, DEFAULT_ACTIONS, actions);
- function extractParams(data){
+ function extractParams(data, actionParams){
var ids = {};
+ paramDefaults = extend(paramDefaults, actionParams);
forEach(paramDefaults || {}, function(value, key){
ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value;
});
@@ -362,7 +368,7 @@ angular.module('ngResource', ['ng']).
var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data));
$http({
method: action.method,
- url: route.url(extend({}, extractParams(data), action.params || {}, params)),
+ url: route.url(extend({}, extractParams(data, action.params || {}), params)),
data: data,
headers: extend({}, action.headers || {})
}).then(function(response) {
diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js
index e6bab249..37a8d568 100644
--- a/test/ngResource/resourceSpec.js
+++ b/test/ngResource/resourceSpec.js
@@ -55,12 +55,14 @@ describe("resource", function() {
$httpBackend.expect('GET', '/Path');
$httpBackend.expect('GET', '/Path/1');
$httpBackend.expect('GET', '/Path/2/3');
- $httpBackend.expect('GET', '/Path/4/5/6');
+ $httpBackend.expect('GET', '/Path/4/5');
+ $httpBackend.expect('GET', '/Path/6/7/8');
R.get({});
R.get({a:1});
R.get({a:2, b:3});
- R.get({a:4, b:5, c:6});
+ R.get({a:4, c:5});
+ R.get({a:6, b:7, c:8});
});
@@ -123,6 +125,27 @@ describe("resource", function() {
});
+ it('should build resource with action default param reading the value from instance', function() {
+ $httpBackend.expect('POST', '/Customer/123').respond();
+ var R = $resource('/Customer/:id', {}, {post: {method: 'POST', params: {id: '@id'}}});
+
+ var inst = new R({id:123});
+ expect(inst.id).toBe(123);
+
+ inst.$post();
+ });
+
+
+ it('should handle multiple params with same name', function() {
+ var R = $resource('/:id/:id');
+
+ $httpBackend.when('GET').respond('{}');
+ $httpBackend.expect('GET', '/1/1');
+
+ R.get({id:1});
+ });
+
+
it("should create resource", function() {
$httpBackend.expect('POST', '/CreditCard', '{"name":"misko"}').respond({id: 123, name: 'misko'});