如何使用mongoose和express从复选框中保存一个布尔值?

时间:2013-03-30 04:52:07

标签: express mongoose

我无法想象用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上映射params。在行var client = new Client(req.body)上,客户端具有从req.body创建的属性名称,其中具有从表单传递的正确值,但属性active不反映复选框状态。

我知道我可以在var client = new Client(req.body)之后添加此行来解决此问题,但我必须为我添加到表单中的每个复选框执行此操作:

client.active = req.body.active == undefined ? false : true;

编辑问题

我不需要在rails上的ruby上做这个技巧。如何在不为每个复选框添加上一行的情况下使用复选框?这是从复选框中保存值的唯一方法,还是有其他选择?

修改

我有另一种情况,其中架构以这种方式定义

var ClientSchema = new Schema({
  name: {type: String, required: true, trim: true},
  active: {type: Boolean, default: true }
});

请注意,默认情况下,active为true,因此如果取消选中该复选框,则激活它将为true,而不是false。

2 个答案:

答案 0 :(得分:1)

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">

这是为了解决未检查的复选框不发送帖子数据这一事实。有关详情,请参阅Does <input type="checkbox" /> only post data if it's checked?

RoR的技巧是隐藏字段,复选框具有name属性的相同值。如果选中该复选框,则复选框字段的值将作为发布数据发送,否则将发送隐藏字段的值。

在RoR版本3.x中确实如此

有关此问题的更多信息&#39;陷阱&#39;可在此处找到:http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box

您需要在节点应用程序中实现此类操作,或者像以前一样检查undefined

答案 1 :(得分:1)

将您的架构布尔值“活动”默认设置为false。

保存新的客户文档时...

var data_in = req.body;
if( data_in.active ){
  data_in.active = true;
}
client = new Client( data_in );

然后照常保存