【发布时间】:2013-03-20 20:30:28
【问题描述】:
我想不出用 express 和 mongoose 保存布尔值的简单方法。我有这个架构:
var ClientSchema = new Schema({
name: {type: String, required: true, trim: true},
active: {type: Boolean }
});
var Client = mongoose.mode('Client', ClientSchema);
这是我的控制器
exports.new = function(req, res) {
var client = new Client();
res.render('clients/new', { item: client } );
};
exports.create = function(req, res) {
var client = new Client(req.body);
client.save(function(err, doc) {
if (err) {
res.render('clients/new', { item: client });
}
....
});
};
这是我的观点
form(method='post', action='/clients', enctype='application/x-www-form-urlencoded')
input(type='text', name='name', value=item.name)
input(type='checkbox', name='active', value=item.active)
Mongoose 能够映射 req.body 上的参数。在 var client = new Client(req.body) 行上,client 具有从 req.body 创建的属性名称,并具有从表单传递的正确值,但属性 active 不反映复选框状态。
我知道我可以在 var client = new Client(req.body) 之后添加这一行来解决这个问题,但我必须为我添加到表单中的每个复选框都这样做:
client.active = req.body.active == undefined ? false : true;
问题已编辑
我不需要在 ruby on rails 上做那个技巧。如何在不为每个复选框添加前一行的情况下使用复选框?这是从复选框中保存值的唯一方法还是有其他选择?
编辑
我还有另一种这样定义架构的情况
var ClientSchema = new Schema({
name: {type: String, required: true, trim: true},
active: {type: Boolean, default: true }
});
请注意,默认情况下 active 为 true,因此如果我取消选中该复选框,则 active 它将为 true,而不是 false。
【问题讨论】:
-
我不确定您的问题是什么 - 您只是不想让行以
client.active...开头? -
在 ruby on rails 上我不需要这样做。我想知道 express.js 和 mongoose 使用复选框的最佳做法是什么。我编辑了我的问题。
-
与 ruby on rails 相比,express.js 是一个极简的框架。 RoR 所做的很多事情都不会为你做。您可能会更幸运地搜索可以为您添加该功能的库(尝试npmjs.org)。或者可能值得一看功能齐全的 MVC 风格的 Web 应用程序框架(可能基于 express)。一种这样的选择是 Compound.js (compoundjs.com)