SeanWM
SeanWM

Reputation: 17009

Simple Schema and multiple forms

I have a user profile schema that looks sort of like this:

Schema.UserProfile = new SimpleSchema({
    name: {
        type: String,
        optional: false
    },
    gender: {
        type: String,
        optional: false,
        allowedValues: ['Male', 'Female']
    },
    location: {
        type: String,
        optional: false
    },
    age: {
        type: Number,
        optional: false
    }
}

My registration form requires the user to select their gender on it. Once registered, the user is presented with another form to fill out the rest of the data: name, location, and age.

Here's the problem: When the user tries to register, I get the error: Name is required. The user isn't suppose to enter their name until they register.

What is the proper approach to only validating data that is actually being saved on a specific form?

EDIT

Here is my registration script:

var data = {};
var profile = {};
data.email = $('#email').val();
data.password = $('#password').val();
profile.gender = $('#gender').val();
data.profile = profile;

Accounts.createUser(data, function (error) {
   // do
   // ERROR: Name is required
});

When the user actually registers, they're presented with a form to fill the other data in. The form submit calls a method that the tries to update the profile object.

Upvotes: 1

Views: 5232

Answers (2)

tim-phillips
tim-phillips

Reputation: 1087

You can use SimpleSchema's pick command to select certain elements from a schema. That way you can have multiple schemas derived from the same original schema definition.

Schemas.UserProfileRegistration1 = Schemas.UserProfile.pick(['gender']);

Schemas.UserProfileRegistration2 = Schemas.UserProfile.pick(['name', 'location', 'age']);

https://github.com/aldeed/meteor-simple-schema#extracting-simpleschemas

Upvotes: 0

notme
notme

Reputation: 461

By using the option optional: false you are making it mandatory whenever creating the object.

One solution could be to use myCollection.insert(); with the flag validate: false instead of createUser().

e.g.

myCollection.insert(doc, {validate: false});

This will not trigger the error, since is skipping the validation.

I would personally not use this way, but it might be a solution.

Upvotes: 0

Related Questions