Getting Backbone.js to Sync With Rails and Mongoid
I have started working with Rails, Backbone.js and mongoDB. I chose Mongoid as the ODM to handle all of my ActiveModel needs within my Rails app. The biggest challenge I ran into, with this configuration, was trying to get all of the syncing functionality working between Backbone.js and Rails.
Fortunately, the URL scheme that Backbone.js uses for syncing data matches perfectly with Rails’ Resource Routing. However, this relies on the JSON that is sent to a Backbone.js model to have a property of id
. But the JSON that is emitted form Rails/Mongoid/mongoDB does not have that property. It has an _id
property to represent the id
of the document.
I have found two ways to solve this problem. First, as this blog post suggests, you can modify the JSON that is emitted. I don’t care for this approach, because this then modifies the every request for JSON, unless you override what you have already overridden. I prefer the approach of letting Backbone know how to interpret your data.
This can be done by setting the idAttribute
property within you model to "_id"
, see the example below.
1 2 3 |
|
Once you have set this in your Backbone.js model, all of the syncing functionality works as expected. Also, when you need to access the id
property of your Backbone.js model it works with the id
property that is provided by backbone. This setting is not documented on the main Backbone.js page, but you can find it in the annotated source code here.