我无法想象用express和mongoose保存布尔值的简单方法.我有这个架构:
var ClientSchema = new Schema({
name: {type: String, required: true, trim: true},
active: {type: Boolean }
});
var Client = mongoose.mode('Client', ClientSchema);
Run Code Online (Sandbox Code Playgroud)
这是我的控制器
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 });
}
....
});
};
Run Code Online (Sandbox Code Playgroud)
这是我的观点
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)
Run Code Online (Sandbox Code Playgroud)
Mongoose有能力在req.body上映射params.在行var client = new Client(req.body)上,客户端具有从req.body创建的属性名称,其中具有从表单传递的正确值,但属性active不反映复选框状态.
我知道我可以在var client = new Client(req.body)之后添加这行来解决这个问题,但我必须为我添加到表单的每个复选框执行此操作:
client.active = req.body.active == undefined ? false : true;
Run Code Online (Sandbox Code Playgroud)
编辑问题
我不需要在轨道上的ruby上做那个技巧.如何在不为每个复选框添加上一行的情况下使用复选框?这是从复选框中保存值的唯一方法,还是有其他选择?
编辑
我有另一种情况,其中模式以这种方式定义
var ClientSchema = new Schema({
name: {type: String, required: true, trim: true},
active: {type: Boolean, default: true }
});
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下,active为true,因此如果取消选中该复选框,则激活它将为true,而不是false.
Ruby on Rails 将在复选框字段旁边输出一个隐藏字段:
<input name="model_name[field_name]" type="hidden" value="false">
<input id="model_name_field_name" name="model_name[field_name]" type="checkbox" value="true">
Run Code Online (Sandbox Code Playgroud)
这是为了避免未选中的复选框不会发送发布数据的事实。请参阅<input type="checkbox" /> 仅在选中后才发布数据吗?了解更多相关信息。
RoR 的技巧是隐藏字段和复选框具有相同的name
属性值。如果选中该复选框,则复选框字段的值将作为发布数据发送,否则将发送隐藏字段的值。
RoR 版本 3.x 中确实存在这种情况
有关此“陷阱”的更多信息可以在这里找到:http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box
您要么需要在节点应用程序中实现此类事情,要么undefined
像以前一样进行检查。
归档时间: |
|
查看次数: |
5642 次 |
最近记录: |