как отправить форму на тот же пост на той же странице - PullRequest
0 голосов
/ 16 мая 2019

Поэтому я пытаюсь отправить форму в том же сообщении (вроде комментариев на Facebook или YouTube, где в сообщении у вас есть поле, вы заполняете поле и отправляете, затем вы перенаправляетесь на ту же страницу, но сообщение имееткомментарий или в моем случае добавлен тег).

Схема

Tag schema

var mongoose = require("mongoose");


var tagSchema = new mongoose.Schema({
    tagDescription: String
});

module.exports = mongoose.model("Tag", tagSchema);

Note Schema

var mongoose = require("mongoose");
var noteSchema = new mongoose.Schema({
    title: String,
    body: String,
    category: String,
    created: { type: Date, default: Date.now },
    tags: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: "Tag"
        }
    ]
});

module.exports = mongoose.model("note", noteSchema);


Поэтому я пробовал следующий код, но всякий раз, когда я отправляю тег, добавляются только тегик первому сообщению, и если я удаляю findOne и заменяю его на находить, не может быть прочитано свойство push undefined.

это страница index.ejs

<div class="card-body">
  <h2 class="card-title"><%= note.title %></h2>
   <div class="card-text-center">
     <p><%= note.category %></p>
       <p><%= note.body.substring(0,20)%>...</p>
         <% note.tags.forEach(function(tag){ %>
             <p><%= tag.tagDescription %></p>
                 <% }) %>
               <div class="float-right card-footer">
        <small><%= note.created.toDateString() %></small>
  </div>
   <p><a href="/notes/<%= note._id %>" class="btn btn-info">Read More</a></p>
     <form action="/" method="post">
       <input class="col-md-2 form-control" type="text" name="tag[tagDescription]" placeholder="Tag" />
     <button class="btn btn-primary">Submit</button>
  </form>

Маршруты

app.post("/", function (req, res) {
    Note.findOne({}, function (err, note) {
        if (err) {
            console.log(err);
            res.redirect("/notes");
        } else {
            Tag.create(req.body.tag, function (err, tag) {
                if (err) {
                    console.log(err);
                } else {
                    note.tags.push(tag);
                    note.save();
                    res.redirect("/notes");
                }
            });
        }
    });
});


app.get("/notes", function (req, res) {
    Note.find({}).populate("tags").exec(function (err, notes) {
        if (err) {
            console.log(err);
        } else {
            res.render("index", { notes: notes/*, tags: i */});
            //console.log(i);

        }
    });

});
app.get("/notes/new", function (req, res) {
   res.render("new");
})
app.post("/notes", function (req, res) {
    Note.create(req.body.note, function (err, newNote) {
        if (err) {
            console.log(err);
        } else {
            res.redirect("/notes");
        }
    });

});

Форма отправки для новой заметки / сообщения

<form action="/notes" method="post">
                <div class="form-group">
                    <label>Title</label>
                    <input class="form-control" type="text" name="note[title]" placeholder="Title" />
                </div>
                <div class="form-group">
                    <label>Category</label>
                    <input class="form-control" type="text" name="note[category]" placeholder="Category" />
                </div>
                <div class="form-group">
                    <label>Note content</label>
                    <textarea class="form-control" name="note[body]" placeholder="Add a new Note..."></textarea>
                </div>
                <div class="form=group">
                    <button class="btn btn-primary btn-large btn-block">Submit</button>
                </div>

            </form>

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

индекс

  <% note.tags.forEach(function(tag){ %>
                                    <div  class="badge">
                                        <div class="badge badge-pill badge-info">
                                        <form action="/notes/<%= note._id %>/tags?_method=DELETE" method="post" style="display: inline">
                                            <button class="btn btn-sm">x</button>
                                        </form>
                                        <%= tag.tagDescription %>
                                        </div>
                                    </div>
                               <% }) %>
                               <p><a href="/notes/<%= note._id %>" class="btn btn-info">Read More</a></p>
                               <div class="float-right card-footer">
                                   <small><%= note.created.toDateString() %></small>
                               </div>
                               <form action="/notes/<%= note.id %>/tags" method="post">
                                   <input class="col-md-2 form-control" type="text" name="tag[tagDescription]" placeholder="Tag" />
                                   <button class="btn btn-primary">Add Tag</button>
                               </form>

маршруты

app.post("/notes/:id/tags", function (req, res) {
    Note.findById(req.params.id, function (err, note) {
        if (err) {
            res.redirect("/notes");
        }
        else {
            Tag.create(req.body.tag, function (err, tag) {
                if (err) {
                    console.log(err);
                }
                else {
                    note.tags.push(tag);
                    note.save();
                    res.redirect("/notes");
                }
            });
        }
    });
});

Note.find({}).populate("tags").exec(function (err, notes) {
        if (err) {
            console.log(err);
        } else {
            res.render("index", { notes: notes });


        }
    });
0 голосов
/ 17 мая 2019

При публикации тега маршрут должен знать, к какой ноте принадлежит тег.Вместо использования findOne (), я бы предпочел исходное решение, которое вы использовали, путем маршрутизации к notes /: id / tag и вызову

Note.findById(req.params.id, ...);

Если вы настаиваете на публикации в '/' в качестве маршрута,Вы можете передать noteId в качестве параметра

<form action="/?noteId=<%= note.id %>" method="post">

и затем поймать его на своем маршруте

Note.findById(req.body.noteId, ...);

Компромиссы для использования вложенных ресурсов в REST хорошо обсуждаются здесь .

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