【问题标题】:How to save a boolean value from a checkbox using mongoose and express?如何使用猫鼬和快递从复选框中保存布尔值?
【发布时间】: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)

标签: express mongoose


【解决方案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 属性值。如果复选框被选中,则复选框字段的值将作为 post 数据发送,否则将发送隐藏字段的值。

在 RoR 版本 3.x 中肯定是这种情况

可以在此处找到有关此“问题”的更多信息:http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box

你要么需要在你的节点应用程序中实现这种东西,要么像以前一样检查undefined

【讨论】:

    【解决方案2】:

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

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

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

    然后像往常一样保存

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2015-12-12
      • 2020-03-08
      • 2019-09-23
      • 2016-12-31
      • 1970-01-01
      相关资源
      最近更新 更多