Learn web development

Страница списка книг

Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.

Далее мы реализуем нашу страницу списка книг. На этой странице должен отображаться список всех книг в базе данных вместе с их автором, причем каждое название книги является гиперссылкой на соответствующую страницу сведений о книге.

Контроллер

TФункция контроллера списка книг должна получить список всех объектов Book в базе данных, а затем передать их для отрисовки шаблона.

Откройте /controllers/bookController.js. Найдите экспортированный метод контроллера  book_list() и замените его .

// Display list of all Books.
exports.book_list = function(req, res, next) {

  Book.find({}, 'title author')
    .populate('author')
    .exec(function (err, list_books) {
      if (err) { return next(err); }
      //Successful, so render
      res.render('book_list', { title: 'Book List', book_list: list_books });
    });
    
};

Метод использует функцию моделиfind() для возврата всех объектов Book, выбрав для возврата только заголовок и автора, поскольку нам не нужны другие поля (он также вернет _id и виртуальные поля). Здесь мы также вызываем populate() on Book, указывая поле  author —это заменит сохраненный идентификатор автора книги полными сведениями об авторе.

При успешном выполнении, обратный вызов передаст запрос на отрисовку шаблона book_list(.pug), передаст title иbook_list (список книг с автором) в качестве переменных.

View

Создайте /views/book_list.pug и скопируйте тескт ниже.

extends layout

block content
  h1= title
  
  ul
  each book in book_list
    li 
      a(href=book.url) #{book.title} 
      |  (#{book.author.name})

  else
    li There are no books.

View расширит базовый шаблон layout.pug и переопределит block с именем 'content'. Он отображает  title который мы передали из контроллера (с помощью метода render() ), а затем перебирает переменную book_list  используя синтаксис each-in-else . Для каждой книги создается элемент списка, отображающий название книги в виде ссылки на страницу сведений о книге, за которой следует имя автора. . Если в  book_list нет кни,  то выполняется else, и displays the text отображает текст "нет книг".'

Заметка: Мы используем book.url  для предоставления ссылки на подробную запись для каждой книги (мы реализовали этот маршрут, но не страницу). Это виртуальное свойство модели Book model которая использует поле  _id для создания уникального URL.

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

На что это похоже?

Запустите приложение (смотрите тестирование маршрутов для соответствующей команды) и откройте ваш браузерпо адресу:  http://localhost:3000/. Затем выберите ссылку:  All books. Если все сделано корректно, то вы должны увидеть нечто подобно скриншоту ниже.

Book List Page - Express Local Library site

Next steps

Метки документа и участники

Внесли вклад в эту страницу: MariyaSka
Обновлялась последний раз: MariyaSka,