Я использую mongoDB и ejs для отображения всех моих пользователей в таблице. В таблице также есть несколько кнопок действий для удаления пользователя и изменения роли пользователя. Кнопки открывают всплывающее окно для изменения роли или подтверждения удаления. Но EJS не передает информацию о пользователях во всплывающее окно. Он отлично работает в таблице, но не во всплывающем окне.
Моя пользовательская таблица EJS с всплывающим окном смены роли:
<tbody>
<%users.forEach(function(users){%>
<tr>
<td><%=users.name%></td>
<td><%=users.username%></td>
<td><%=users.createdAt%></td>
<td><span class = "badge label-table badge-<%=users.role%>"><%=users.role%></span></td>
<td><span class = "badge label-table badge-<%=users.verifyEmailToken%>"><%=users.verifyEmailToken%></span></td>
<td>
<button type = "submit" class = "btn btn-xs btn-success" data-toggle = "modal" data-target = "#con-close-modal" name = "changeRoleButton"><i class = "remixicon-user-settings-line"></i></button>
</td>
</tr>
<div id = "con-close-modal" class = "modal fade" tabindex = "-1" role = "dialog" aria-labelledby = "myModalLabel" aria-hidden = "true" style = "display: none;">
<div class = "modal-dialog">
<div class = "modal-content">
<div class = "modal-header">
<h4 class = "modal-title">Change <%=users.name%> Role</h4>
<button type = "button" class = "close" data-dismiss = "modal" aria-hidden = "true">×</button>
</div>
<form class = "" action = "/changeuserrole" method = "post">
<div class = "modal-body p-4">
<div class = "row">
<div class = "col-md-12">
<div class = "form-group">
<label for = "field-1" class = "control-label">User Role</label>
<select class = "form-control" name = "role">
<option>Partner</option>
<option>Admin</option>
<option>User</option>
</select>
</div>
<button type = "submit" value = "<%=users._id%>" name = "userroleid" class = "btn btn-primary">Submit</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<%});%>
</tbody>
Вот мой app.js, где я ищу пользователей и передаю их в EJS:
app.get("/users", function(req, res) {
if (req.isAuthenticated() && req.user.role === "Admin") {
User.find({}, function(err, foundUsers) {
if (err) {
console.info(err);
} else {
res.render("users", {
users: foundUsers,
name: req.user.name.replace(/ .*/, ''),
email: req.user.username,
});
}
});
} else {
res.redirect("/login");
}
});
Все теги <%=users...%> работают внутри таблицы, но не внутри всплывающих блоков. Внутри всплывающего окна просто отображается информация от первого пользователя в базе данных, что очень странно.
Буду очень благодарен за любую помощь. Спасибо!





Я могу ошибаться, но поскольку всплывающее окно отображает информацию только от первого пользователя, вам может понадобиться, чтобы конкретный идентификатор пользователя был отделен от ссылки. У меня была аналогичная проблема с проектом, за исключением того, что это была ссылка на новое представление вместо всплывающего окна.
Я надеюсь, что эта документация может быть чем-то полезна
https://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html
Ваш код ejs хорош. Я думаю, что проблема в идентификаторе каждого модального окна.
Для каждого пользователя вы создаете модальное окно с id = "con-close-modal", поэтому все ваши модальные окна имеют одинаковый идентификатор. В результате каждая кнопка отправки (у всех есть same data-target = "#con-close-modal") вызывает одно и то же модальное окно, возможно, первое.
Я рекомендую вам дать каждому модальному модулю уникальный идентификатор, например
<div id = "<%= users._id %>" class = "modal fade" tabindex = "-1" role = "dialog" aria-labelledby = "myModalLabel" aria-hidden = "true" style = "display: none;">
и дайте каждой кнопке отправки правильный атрибут data-target
<button type = "submit" ... data-target = "#<%= users._id %>"...></button>