Список авторов. Тест - список жанров
Страница списка авторов должна показывать список всех авторов, хранимых в БД, причём каждое имя автора должно быть связано со страницей подробностей для этого автора. Дата рождения автора и дата смерти должны выводиться в одной строке после имени автора.
Контроллер
Функция контроллера списка авторов должна получить список всех элементов в Author
, и передать этот список в шаблон для отображения.
Откройте файл /controllers/authorController.js. Найдите экспортируемый метод author_list()
в начале файла и замените его следующим ниже кодом:
// Display list of all Authors.
exports.author_list = function (req, res, next) {
Author.find()
.sort([["family_name", "ascending"]])
.exec(function (err, list_authors) {
if (err) {
return next(err);
}
//Successful, so render
res.render("author_list", {
title: "Author List",
author_list: list_authors,
});
});
};
Метод использует такие функции модели как find()
, sort()
и exec()
для того, чтобы вернуть все объекты Author
отсортированными по family_name
в алфавитном порядке. В вызове exec()
колбэк-функция имеет первый параметр- объект ошибок (или null
) и второй параметр - список всех авторов, если ошибок не было. При ошибках вызывается следующая функция промежуточного слоя с полученным значением объекта ошибок, а если ошибок не было, отображается шаблон author_list(.pug), передавая странице title
и список авторов (author_list
).
Представление
Создайте файл /views/author_list.pug и поместите в него следующий текст:
extends layout
block content
h1= title
ul
each author in author_list
li
a(href=author.url) #{author.name}
| (#{author.date_of_birth} - #{author.date_of_death})
else
li There are no authors.
Представление создано по тому же образцу, что и другие шаблоны.
Как это выглядит?
Запустите приложение и откройте браузер с адресом http://localhost:3000/. Выберите ссылку All authors. Если все было сделано правильно, страница должна выглядеть примерно так, как на следующем скриншоте.
Примечание: Представление дат продолжительности жизни автора выглядит безобразно! Это можно исправить, если использовать тот же подход , который применялся для списка BookInstance
(добавить в модель Author
виртуальное свойство продолжительности жизни). Но в этот раз, однако, некоторые даты могут отсутствовать, и ссылки на несуществующие свойства игнорируются, если не задан строгий режим. Метод moment()
возвращает текущее время, и нежелательно, чтобы отсутствующие даты форматировались как "сегодня". Один из способов состоит в том, чтобы форматирующая функция возвращала пустую строку, если дата не существует. Например:
return this.date_of_birth ? moment(this.date_of_birth).format('YYYY-MM-DD') : '';
Тест - страница списка жанров!
В этой части требуется создать собственную страницу списка жанров. Страница должна показывать жанры, имеющиеся в БД, а для каждого жанра должна быть создана ссылка на страницу с детальной информацией. Скриншот ожидаемого результата приводится ниже.
Функция контроллера списка жанров должна получить список всех экземпляров Genre
, и передать его в шаблон для отображения.
-
Следует отредактировать
genre_list()
в файле /controllers/genreController.js. -
Реализация почти такая же, как и для контроллера
author_list()
.- Sort the results by name, in ascending order.
-
Отображающий шаблон должен быть назван genre_list.pug.
-
Шаблону для отображения должны быть переданы переменные
title
(строка 'Genre List') иgenre_list
(the list of список жанров, который вернёт колбэк-функцияGenre.find()
. -
Представление должно соответствовать скриншоту, приведённому ранее (оно должно иметь структуру и формат, похожие на таковые в представлении списка авторов, за исключением, конечно, продолжительности жизни, так как для жанров даты не заданы).
Далее
Вернуться к части 5 - Express Tutorial Part 5: Displaying library data.
Перейти к следующему подразделу в части 5: подробная информация о жанрах (Genre detail page).