9

I have a Collection that needs to POST some data to its url to get the data it needs. The answer to these two questions, Fetch a collection using a POST request? and Overriding fetch() method in backbone model, make it seem like I should be able to get it to work like this:

fetch: function( options ) {
  this.constructor.__super__.fetch.apply(this, _.extend(options,{data: {whatever: 42}, type: 'POST'}));
}

, but Firebug still shows me a 404 error that is happening because a GET is being executed against the url in question (and the underlying Rails route only allows POST). Should this be working? If so, what else might I try? If not, what have I done wrong?

Community
  • 1
  • 1
cbmanica
  • 3,502
  • 7
  • 36
  • 54
  • Have you considered overriding Backbone's [`sync`](http://backbonejs.org/#Sync) or [`ajax`](http://backbonejs.org/#Sync-ajax) methods? – mu is too short Mar 11 '13 at 22:48
  • I would, if 1) I could figure out how, and 2) I could be convinced that overriding all of sync (which sounds hard and involved), was necessary because overriding fetch (which seems like it should be easy) has no chance of working. – cbmanica Mar 11 '13 at 22:55
  • 1
    Incidentally, the actual answer is that one of the posts I linked to didn't make it clear that the second argument to `apply` has to be an array. D'oh. – cbmanica Mar 13 '13 at 22:36
  • Right, I missed that! I always get the [`call`](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call) and [`apply`](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply) signatures mixed up. – mu is too short Mar 14 '13 at 00:49
  • Possible duplicate of [What is the least ugly way to force Backbone.sync updates to use POST instead of PUT?](http://stackoverflow.com/questions/8527694/what-is-the-least-ugly-way-to-force-backbone-sync-updates-to-use-post-instead-of) – Emile Bergeron Dec 12 '16 at 02:13

1 Answers1

16

After reading the question again, here's a way to force the fetch to use POST per fetch call. (Thanks for the comments)

yourCollection.fetch({
    data: $.param({id: 1234}), 
    type: 'POST', 
    success: function(d){
        console.log('success');
    }
});

Another approach is to override the AJAX implementation itself to use POST for all calls.

Backbone.ajax = function() {
    var args = Array.prototype.slice.call(arguments, 0);
    _.extend(args[0], { type: 'POST' });
    return Backbone.$.ajax.apply(Backbone.$, args);
};
Madbreaks
  • 19,094
  • 7
  • 58
  • 72
Dennis Rongo
  • 4,611
  • 1
  • 25
  • 25