Wednesday, 3 May 2017

Update database with multiple reference database issues

I am fairly new to mongoose/express. What I am struggling with is trying to update new data from html form and save it to database that has references. I have a business model with location reference to location model. Here's the codes.

edit.ejs

<div class="container">
    <div class="form-container">
        <form action="/<%= bus._id %>?_method=PUT" method="POST">
            <!-- business info -->
            <h3>Business Information</h3>
            <input class="form-input" type="input" name="bus[logo]" value="<%= bus.logo %>">
            <input class="form-input" type="input" name="bus[name]" value="<%= bus.name %>">
            <% bus.location.forEach(function(location) { %>
            <input class="form-input" type="input" name="bus.location[street]" value="<%= location.street %>">
            <input class="form-input" type="input" name="bus.location[city]" value="<%= location.city %>">
            <div class="state-input">
                <select class="form-inline" name="bus.location[state]">
                    <option value="" disabled selected><%= location.state %></option>
                    <option value="AL">Alabama</option>
                    ...
                    <option value="WY">Wyoming</option>
                </select>   
            </div><!--State-input -->
            <input class="form-inline" type="input" name="bus.location[zipcode]" value="<%= location.zipcode %>">
            <% }) %>
            <!--Contact info-->
            <h4>Contact Information</h4>
            <% bus.contact.forEach(function(contact) { %>
            <input class="form-input" type="url" name="bus[url]" value="<%= bus.url %>">
            <input class="form-input" type="email" name="bus.contact[email]" value="<%= contact.email %>">
            <input class="form-input" type="tel" name="bus.contact[phone]" value="<%= contact.phone %>">
            <input class="form-input" type="input" name="bus.contact[twitter]" value= "<%= contact.twitter %>">
            <input class="form-input" type="input" name="bus.contact[facebook]" value="<%= contact.facebook %>">
            <input class="form-input" type="input" name="bus.contact[instagram]" value="<%= contact.instagram %>">
            <% }) %>

index.js - edit routes

//(edit.ejs) Edit Route 
app.get('/:id/edit', function(req, res) {
    Business.findById(req.params.id)
    .populate('location')
    .populate('contact')
    .populate('images')
    .exec(function(err, bus) {
        if(err) {
            console.log(err);
        } else {
            res.render('edit', {bus:bus});
        }
    });
});
app.put('/:id', function(req, res) {
    Business.findByIdAndUpdate(req.params.id, req.body.bus, function(err, bus) {
        if(err) {
            console.log(err);
            res.redirect('/' + req.params.id + '/edit');
        } else {
            res.redirect('/' + req.params.id);
        }
    });
});

The business (bus) updates nicely but bus.location doesn't update. Business model

//----------------------------------------------------------------------------\\
var mongoose = require('mongoose');
//----------------------------------------------------------------------------\\
var busSchema = new mongoose.Schema({
    name: String,
    type: String,
    logo: String,
    desc: String,
    subs: Number,
    video: String,
    url: String,
    firstRun: Boolean,
    location:[ 
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: 'Location'
      }
    ],
    contact:[
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: 'Contact'
      }
    ],
    images:[
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: 'Image'
      }
    ],
    comments:[
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: 'Comment'
      }   
    ],
    created: {
       type: Date, default: Date.now
    }
});
//----------------------------------------------------------------------------\\
module.exports = mongoose.model('Business', busSchema);

Location Model

//----------------------------------------------------------------------------\\
var mongoose = require('mongoose');
//----------------------------------------------------------------------------\\
var locSchema = new mongoose.Schema(
    {
        street: String,
        city: String,
        state: String,
        zipcode: Number
    }  
);
//----------------------------------------------------------------------------\\
module.exports = mongoose.model('Location', locSchema);



via Matthew Restine

No comments:

Post a Comment