aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Resource.js14
-rw-r--r--test/ResourceSpec.js18
2 files changed, 26 insertions, 6 deletions
diff --git a/src/Resource.js b/src/Resource.js
index bed3def6..c0c7934c 100644
--- a/src/Resource.js
+++ b/src/Resource.js
@@ -43,14 +43,14 @@ ResourceFactory.DEFAULT_ACTIONS = {
};
ResourceFactory.prototype = {
- route: function(url, idPaths, actions){
+ route: function(url, paramDefaults, actions){
var self = this;
var route = new Route(url);
actions = $.extend({}, ResourceFactory.DEFAULT_ACTIONS, actions);
- function extractIds(data){
+ function extractParams(data){
var ids = {};
- foreach(idPaths, function(path, id){
- ids[id] = Scope.getter(data, path);
+ foreach(paramDefaults, function(value, key){
+ ids[key] = value.charAt && value.charAt(0) == '@' ? Scope.getter(data, value.substr(1)) : value;
});
return ids;
}
@@ -83,7 +83,7 @@ ResourceFactory.prototype = {
}
var value = action.isArray ? [] : new Resource(data);
- self.xhr.method(action.method, route.url($.extend({}, action.params || {}, extractIds(data), params)), data, function(response) {
+ self.xhr.method(action.method, route.url($.extend({}, action.params || {}, extractParams(data), params)), data, function(response) {
if (action.isArray) {
foreach(response, function(item){
value.push(new Resource(item));
@@ -96,6 +96,10 @@ ResourceFactory.prototype = {
return value;
};
+ Resource.bind = function(additionalParamDefaults){
+ return self.route(url, $.extend({}, paramDefaults, additionalParamDefaults), actions);
+ };
+
if (!isGet) {
Resource.prototype['$' + name] = function(a1, a2){
var params = {};
diff --git a/test/ResourceSpec.js b/test/ResourceSpec.js
index 562d6500..799c7378 100644
--- a/test/ResourceSpec.js
+++ b/test/ResourceSpec.js
@@ -62,7 +62,7 @@ describe("resource", function() {
beforeEach(function(){
xhr = new MockXHR();
resource = new ResourceFactory(xhr);
- CreditCard = resource.route('/CreditCard/:id:verb', {id:'id.key'}, {
+ CreditCard = resource.route('/CreditCard/:id:verb', {id:'@id.key'}, {
charge:{
method:'POST',
params:{verb:'!charge'}
@@ -80,6 +80,15 @@ describe("resource", function() {
expect(typeof CreditCard.query).toBe('function');
});
+ it("should build resource with default param", function(){
+ xhr.expectGET('/Order/123/Line/456.visa?minimum=0.05').respond({id:'abc'});
+ var LineItem = resource.route('/Order/:orderId/Line/:id:verb', {orderId: '123', id: '@id.key', verb:'.visa', minimum:0.05});
+ var item = LineItem.get({id:456});
+ xhr.flush();
+ nakedExpect(item).toEqual({id:'abc'});
+
+ });
+
it("should create resource", function(){
xhr.expectPOST('/CreditCard').data({name:'misko'}).respond({id:123, name:'misko'});
@@ -155,5 +164,12 @@ describe("resource", function() {
expect(callback).wasCalledWith(cc);
});
+ it('should bind default parameters', function(){
+ xhr.expectGET('/CreditCard/123.visa?minimum=0.05').respond({id:123});
+ var Visa = CreditCard.bind({verb:'.visa', minimum:0.05});
+ var visa = Visa.get({id:123});
+ xhr.flush();
+ nakedExpect(visa).toEqual({id:123});
+ });
});