Skip to content

Instantly share code, notes, and snippets.

@kevinthompson
Last active October 13, 2015 15:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kevinthompson/4219217 to your computer and use it in GitHub Desktop.
Save kevinthompson/4219217 to your computer and use it in GitHub Desktop.
Supporting Rails Nested Resources in Batman.js
class App.Model extends Batman.Model
@persist App.Storage
@encodeAttributesFor: ->
@encodeAttributesForKeys ?= []
for key in arguments
if typeof key == 'string'
@encodeAttributesForKeys.splice(index,1) if (index = @encodeAttributesForKeys.indexOf(key)) > 0
@encodeAttributesForKeys.push key
class App.Storage extends Batman.RailsStorage
@::before 'create', 'update', (env, next) ->
if env.subject.constructor.encodeAttributesForKeys?
data = env.options.data
if namespace = @recordJsonNamespace(env.subject)
obj = data[namespace]
else
obj = data
for key in env.subject.constructor.encodeAttributesForKeys
if obj[key]
obj["#{key}_attributes"] = obj[key] if obj[key].length
delete obj[key]
next()
@::after 'update', @skipIfError (env, next) ->
if env.subject and env.subject.constructor.encodeAttributesForKeys?
for key in env.subject.constructor.encodeAttributesForKeys
objects = env.subject.get(key)
if objects?.constructor.name == 'AssociationSet'
objects.forEach (object) ->
if object.get('_destroy')
objects.remove(object)
else
object.get('dirtyKeys').clear()
object.get('_dirtiedKeys').clear()
class App.Store extends App.Model
@hasMany 'products'
@encodeAttributesFor 'products'
@orangewolf
Copy link

oooh, that's lovely.

@redterror
Copy link

If there was a way to work this into the RailsStorage adapter then it seems like an easy merge. Not sure how you'd do that, but that seems like the right spot.

@kevinthompson
Copy link
Author

Updated the implementation to use Batman.RailsStorage so that the toJSON method doesn't need to be overwritten.

@kevinthompson
Copy link
Author

Added @::after 'update' callback to clean up nested objects after a successful updated.

@turizoft
Copy link

Any chance of this getting merged into BatmanJS core?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment