2013-03-30 7 views
6

Ich kann keinen einfachen Weg finden, um einen booleschen Wert mit Express und Mungo zu speichern. Ich habe dieses Schema:Wie speichert man einen booleschen Wert aus einem Kontrollkästchen mit Mungo und Express?

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

var Client = mongoose.mode('Client', ClientSchema); 

Das ist mein Controller

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 }); 
    } 
    .... 
    }); 
}; 

Und das ist meine Ansicht

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 hat die Fähigkeit, die params auf req.body abzubilden. In der Zeile var client = new Client (req.body) hat der Client den Eigenschaftsnamen aus req.body mit dem korrekten Wert aus dem Formular erstellt, aber die Eigenschaft active gibt den Status des Kontrollkästchens nicht wieder.

Ich weiß, dass ich dieses Problem lösen kann diese Zeile nach var Client Hinzufügen = new Client (req.body), aber ich muss es tun, für jedes Kontrollkästchen ich meine Formen hinzufügen:

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

Frage bearbeitet

Ich brauche diesen Trick auf Ruby on Rails nicht zu tun. Wie kann ich Kontrollkästchen verwenden, ohne die vorherige Zeile für jedes Kontrollkästchen hinzuzufügen? Nur so können Werte aus Checkboxen gespeichert werden oder gibt es Alternativen?

bearbeiten

ich einen anderen Fall, wo das Schema auf diese Weise definiert ist

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

Beachten Sie, dass standardmäßig aktiv wahr ist, also wenn ich das Kontrollkästchen deaktivieren, aktiv es wahr sein, nicht falsch.

+0

Ich bin mir nicht sicher, was Ihre Frage ist - Sie wollen einfach nicht die Zeile "client.active ..." starten lassen? – UpTheCreek

+0

Auf Rubin auf Schienen muss ich diesen Trick nicht machen. Ich möchte wissen, was ist die beste Praxis auf express.js und Mungo mit Kontrollkästchen. Ich habe meine Frage bearbeitet. – Camilo

+1

Im Vergleich zu Ruby on Rails ist express.js ein extrem minimaler Rahmen. Es wird viele Dinge geben, die RoR tut, die Ihnen nicht gut tun. Möglicherweise haben Sie mehr Glück bei der Suche nach einer Bibliothek, die diese Funktionalität für Sie hinzufügen wird (versuchen Sie es mit https://npmjs.org/).Oder es lohnt sich, ein voll funktionsfähiges Web-App-Framework im MVC-Stil zu betrachten (vielleicht auf der Grundlage von Express). Eine solche Option ist compound.js (http://compoundjs.com/) – UpTheCreek

Antwort

1

Ruby on Rails Ausgang ein verstecktes Feld neben einer Checkbox Feld:

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

Dies ist um die Tatsache zu bekommen, dass Kontrollkästchen, die nicht überprüft werden, nicht post-Daten gesendet. Weitere Informationen hierzu finden Sie unter Does <input type="checkbox" /> only post data if it's checked?.

Der Trick hier, von RoR, ist das versteckte Feld und das Kontrollkästchen haben den gleichen Wert für das Attribut name. Wenn das Kontrollkästchen aktiviert ist, wird der Wert des Kontrollkästchenfelds als Post-Daten gesendet, andernfalls wird der Wert des ausgeblendeten Feldes gesendet.

Dies war sicherlich der Fall in RoR Version 3.x

Weitere Informationen zu diesem ‚Gotcha‘ sind hier zu finden: http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box

müssen Sie entweder diese Art der Sache in Ihrer Knoten-Anwendung implementieren oder überprüfe wie bisher undefined.

Verwandte Themen