Mongoose - Форма для сохранения модели со встроенными документами - PullRequest
1 голос
/ 28 сентября 2011

Возникли проблемы при сохранении встроенного массива в модель Mongoose.

Пожалуйста, см. Редактирование внизу.

У меня есть форма для создания BlogPost в Express с использованием Mongoose дляхранить данные в монго.Я могу создавать и просматривать новые посты блога, однако я только что добавил встроенную ленту схемы документа в модель BlogPost и не могу получить массивы каналов для сохранения из формы в модель

код:

BlogPosts.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/my_database');

var Schema = mongoose.Schema
  , ObjectId = Schema.ObjectId;

var Feeds = new Schema({
    name      : { type: String }
  , key       : { type: String }
});

var BlogPost = new Schema({
    author    : ObjectId
  , title     : { type: String, required: true, index: { unique: true } }
  , date      : { type: Date, required: true, default: Date.now }
  , feeds     : [Feeds]
});

mongoose.model('BlogPost', BlogPost);

web.js

...
app.get('/blogpost/new', function(req, res) {
    res.render('blogposts/blogpost_new.jade', { locals: {
        title: 'New BlogPost'
    }
    });
});

app.post('/blogpost/new', function(req, res){
    var b = new BlogPost(req.body.b)
    b.save(function() {
      b.feeds.push();
      res.redirect('/blogposts');
    });
});
...
var BlogPost = mongoose.model('BlogPost', BlogPost);

Нефритовая форма

form( method="post")
  div
    div
      span Title :
      input(type="text", name="b[title]", id="editBlogPostTitle")
    div 
      span Feeds :
      ul 
        li 
          span name
          textarea( name="f[name]", rows=20, id="editBlogPostBodyName")
        li
          span key
          textarea( name="f[key]", rows=20, id="editBlogPostBodyKey")
    div#editBlogPostSubmit
      input(type="submit", value="Send")

Если я заполняю эту форму, модель публикует и сохраняет, но каналыданных там нет ("feeds" : [ ]).

Как правильно передать данные каналов для сохранения в массив?

Редактировать

Поэтому мне удалось настроить форму для сохранения объекта Feed с name и key в BlogPost, выполнив следующие действия.Тем не менее, это все еще необходимо улучшить, чтобы обеспечить возможность сохранения нескольких каналов в момент создания одного BlogPost.С моим текущим решением я могу правильно сохранить только один канал.Мысли?

blogposts.js (просто измените Feeds на Feed

var Feed = new Schema({
...

web.js (только что переместил push)

app.post('/blogpost/new', function(req, res){
    var b = new BlogPost(req.body.b)
    b.feeds.push(req.body.feed);
    b.save(function() {
      res.redirect('/blogposts');
});

});

форма (просто измените имена каналов)

    li
        span name
        textarea( name="feed[name]", rows=20, id="editBlogPostBodyKey")
    li
        span key
        textarea( name="feed[key]", rows=20, id="editBlogPostBodyKey")

Это сохраняет должным образом, я просто не могу создать несколько каналов внутри поста блога во время сохранения.Любая помощь с благодарностью.спасибо.

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Для маршрутов:

Вам не нужно делать b.feeds.push(); на стороне сообщения. У меня есть толчок на стороне get при создании нового объекта, но только потому, что я ожидаю, что будет хотя бы одна вложенная модель. Опять же, учитывая, что у вас есть список, вы можете добавить b.feeds.push(); также на стороне получения.

Для просмотра необходимо сохранить модель в целости.

Предположим, что b - это пост блога, и это ваш родитель в списке f, тогда вы захотите:

span Feeds :
  - var i = 0;
  ul
  - each feed in blogPost.feeds
    li 
      span name
      textarea( name="blogPost[feeds][i][name]", rows=20, id="editBlogPostBodyName")=feed.name
    li
      span key
      textarea( name="blogPost[feeds][i][key]", rows=20, id="editBlogPostBodyKey")=feed.key
    - i++

rout.js (или route / blogPosts.js):

app.get('/blogpost/new', function(req, res) {
    post = new BlogPost();
    post.feeds.push(new Feed());
    res.render('blogposts/blogpost_new.jade', { locals: {
        title: 'New BlogPost',
        blogPost: post
    }
    });
});

edit Я изменил b на blogPost и f для подачи в представление. также добавлена ​​«новая» логика в определении маршрутов.

Обратите внимание, что в этом случае любые маршруты не будут редактироваться. Теоретически, он должен удалять и сохранять любые новые каналы в четном виде, редактируя их (если вы хотите выполнить обновление). Если вы хотите, чтобы они были независимыми объектами, которые можно редактировать, вам нужно предоставить им идентификаторы и добавить средства для их получения по идентификатору. Я верю, что этот подход описан на mongoosejs.com.

0 голосов
/ 03 октября 2011

Что бы это ни стоило, я заставил это работать.Посмотрите мое редактирование выше, которое сработало, как только я добавил [] к имени канала: "feed[0][name]" and "feed[0][key]", а затем "feed[1][name]" and "feed[1][key]".Спасибо Шанс за некоторые хорошие идеи.Для меня это не сработало, чтобы поместить эту логику в маршрут get, это должно было быть в post.Большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...