我正在构建一个应用程序,人们可以将技能放入其中。我使用此代码创建了一个编辑控制器:
/**
* Action blueprints:
* `/skill/edit`
*/
edit: function(req, res, next) {
Skill.findOne(req.param('id'), function foundSkill(err, skill) {
// if skill is not find output an error
if (err) return next(err);
// if the skill is find
if(!skill) return next();
// Show skill
res.view({
skill:skill
});
});
// Get an array of all categorys in the Category collecction
Category.find(function foundCategorys(err, categorys) {
// if category is not find output an error
if (err) return next(err);
// pass the array down to the /view/index.ejs page
res.view({
categorys:categorys
});
});
},
用户必须根据每项技能选择一个类别。所以我认为这是实现这一目标的方法。
这是edit.ejs视图文件中的代码:
<div class="wrapper" id="skill_page">
<div class="col-md-12">
<article>
<form action="/skill/update/<%= skill.id %>" method="POST" class="form-signin" id="edit-skill-form">
<h2 class="form-sigin-heading">Edit an skill</h2>
<div class="input-form">
<input type="text" class="form-control" placeholder="Skill title" name="title" value="<%= skill.title %>">
</div>
<div class="input-form">
<select name="skillCat">
<option>Choose category</option>
<% for(category in categories) { %>
<option value="<%= category.id %>"><%= category.title %></option>
<% } %>
</select>
</div>
<div class="input-form">
<label for="ratingType">Rating on or of</label>
<select name="ratingType" id="ratingType">
<option>Choose rating type</option>
<option>No-rating</option>
<option value="true">Rating</option>
</select>
</div>
<input type="submit" class="btn btn-lg btn-primary btn-block" value="Save changes">
<input type="hidden" name="_csrf" value="<%= _csrf %>">
</form>
</article>
</div>
</div>
当我在控制台中使用sails lift
解除应用程序,然后转到特定技能的技能编辑页面时会出现如下错误:
error: Error rendering view at :: /vagrant/Skillsmatrix/views/skill/edit
error: Using layout located at :: /vagrant/Skillsmatrix/views/layout
error: Server Error (500)
error: ReferenceError: /vagrant/Skillsmatrix/views/skill/edit.ejs:5
3| <div class="col-md-12">
4| <article>
>> 5| <form action="/skill/update/<%=
skill.id %>" method="POST" class="form-signin" id="edit-skill-form">
6| <h2 class="form-sigin-heading">Edit an skill</h2>
7| <div class="input-form">
8| <input type="text" class="form-control" placeholder="Skill title" name="title" value="<%= skill.title %>">
skill is not defined
但我不知道如何解决问题或我做错了什么。特别是为什么错误skill is not defined
会出现。如果有人给我帮助和/或反馈,我真的很满!
答案 0 :(得分:0)
有几件事:
首先,AFAIK,动作函数中没有回调,因此签名应该更像edit: function(req, res) {...
。
第二:您正在异步运行两个查询(针对技能和类别),因此渲染器永远不会同时获取这两个值。如果您在视图中需要技能和类别,则必须嵌套调用。类似的东西:
/**
* Action blueprints:
* `/skill/edit`
*/
edit: function(req, res, next) {
Skill.findOne(req.param('id'), function foundSkill(err, skill) {
// if skill is not find output an error
if (err) return res.serverError(err);
// if the skill is find
if(!skill) return res.notFound();
// Get an array of all categories in the Category collection
Category.find(function foundCategories(err, categories) {
// if category is not find output an error
if (err) return res.serverError(err);
return res.view({
skill: skill,
categories: categories
});
});
});
},
与此同时,您在视图中看起来并没有使用类别。所以,如果它只是一些遗留代码,只需将其删除(因为它会导致您的问题):
/**
* Action blueprints:
* `/skill/edit`
*/
edit: function(req, res, next) {
Skill.findOne(req.param('id'), function foundSkill(err, skill) {
// if skill is not find output an error
if (err) return res.serverError(err);
// if the skill is find
if(!skill) return res.notFound();
return res.view({
skill: skill
});
});
},
答案 1 :(得分:0)
我附近有人帮助我找出解决方案。我的问题是我想要同时获得2个对象。使用代码,我没有工作。
所以这是解决方案的工作方式:
/**
* Action blueprints:
* `/skill/edit`
*/
edit: function(req, res, next) {
Skill.findOne(req.param('id'), function foundSkill(result, skill) {
Category.find(function foundCategorys(err, categories) {
res.view({
skill:skill,
categories: categories
});
});
});
},
如果某人有更好或更有效的方式,我想知道!