Search code examples
ember.jsfirebaseemberfire

Set multiple data with Ember and make it persist on Firebase


I am trying to set data from two models (that has hasMany & belongsTo relationship) and save them to firebase.

'list' data ends up being saved to firebase but not user data.

I think I'm doing something wrong at step 3. I'd appreciate your help!

import Ember from 'ember';

export default Ember.Route.extend({
    model: function() {
        return this.store.find('list');
    },
actions: {
    createList: function() {
        var newListTitle = this.controllerFor('lists').get('newListTitle');
        var username = this.get('session.user.displayName');
        alert(this.get('session.user.displayName'));

        if (Ember.isBlank(newListTitle)) { return false; }

    //1
        var list = this.store.createRecord('list', {
            title: newListTitle,
            user: username,
        });

    //2
        this.controllerFor('lists').set('newListTitle', '');

        var _this = this;

    //3
            list.save().then(function(list) {
                user.get('lists').addObject(list);
                user.save();
                _this.transitionTo('lists.show', list); //4
            });

        }
    }
});

Solution

  • Restructured your adding logic as well as user defined models, also modified your route, which could look like this in Edit and View mode. Meaning you can have more than one item returned from "model".

    // Update models
    
    App.List = DS.Model.extend({
         value:     DS.attr('string')
    });
    
    App.User = DS.Model.extend({
        name:   DS.attr('string')
    });
    
    App.UserLists = DS.Model.extend({
       user: DS.belongsTo('user'),
       list: DS.belongsTo('list')
    });
    
    
    
        export default Ember.Route.extend({
            LIST:SHOW ROUTE
            model: function(params) {
    
                var store = this.get('store');
                var userPromise = store.find('user', params.id);
    
                return Ember.RSVP.hash({
                    user: userPromise,
                    userList : userPromise.then(function(user) {
                        return store.find(userList, { WhereUserIdIs : user.get('id') })
                    });
                });
            },
        actions: {
            createList: function() {
                var self = this;
    
                var failure = function(reason) {
                    // handle stuff
                };
    
                var list = this.store.createRecord('list', {
                    title: this.get('title'),
                });
    
                var user = this.get('user');
    
                var usersList = store.createRecord('userList', {
                    'user': user,
                    'list': list
                });
    
                list.save().then(function(list) {
                    user.save().then(function() {
                        userList.save().then(function() {
                            self.transitionTo('lists.show', list.get('id'));
                        }, failure);
                    }, failure);
                }, failure);
    
            }
        });