Skip to content

Instantly share code, notes, and snippets.

@richsoni
Last active December 20, 2015 03:18
Show Gist options
  • Save richsoni/6062227 to your computer and use it in GitHub Desktop.
Save richsoni/6062227 to your computer and use it in GitHub Desktop.
Tutorial on Models.Base, and how to make a child

Creating Models becomes much easier with the Base Model.

In this example I will walk through some of the default conventions and requirements for creating such a model.

((Models) ->
Models.Client = Models.Base.extend
someCode: ->
)(Application.Models)
#In the above code the model extends base by calling Models.Base.Extend
#At a minimum this is what is needed to create a base Model
#base also ensures that all nested models and collections are properly created in both parse and initialize
#client.js.coffee
#just declare collections with has_many and the attribute name
#and models with has_one and the attribute name
has_many: ["email_addresses", "addresses", "phone_numbers"]
#if the attribute name does not match the model/collection name, then pass an object {attr: class}
has_one:
"primary_email_address" : "Email"
"primary_address" : "Address"
#base will handle the parsing and initializing of these in its default functions
#base.js.coffee
initialize: (object) ->
@setup_nested()
parse: (json) ->
@setup_nested(json)
json
#you can iterate through the nested keys by using the following functions:
@models() # -> ['primary_email_address', 'primary_address']
@collections() # -> ["email_addresses", "addresses", "phone_numbers"]
#the base model does some work for you. firstly it binds the backbone url function to be called by default.
#this enables you to use urlRoot in its proper way. rails-backbone messes this up.
#(this rids the need for that url: -> "clients/#{@id}" nonsense
#Base.js.coffee
url: -> Backbone.Model.prototype.url.call @
#Client.js.coffee
urlRoot: "/clients"
#base will validate your nested models and collections by default for you
#if a collection is a BaseCollection then it will return validate on all the models
#in addition you can set presence validations within the model, and they will be called by default
#client.js.coffee
validates_presence_of: ["name"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment